Files
openobserve/web/src/components/AppTable.vue
T
52e11d3ee7 fix: o2 UI table improvements (#8033)
### **User description**
This PR improves the following 
`Fix: checkboxes as per design for alert list


Fix: general setting, platform settings modified as per design

Fix: numeric input in general settings as per design

Fix: introduced all variables according to design

Fix: secondary button, primary button, tabs, search input added

Fix: another major change related to tabs, sticky header and footer
table

Fix: light mode q-toggle redesign done for both lg and small

Fix: pipeline list as per new design

Fix: added removed padding at the child level for pipeline editor

Fix: function list table as per design changed

Fix: made filtering rows based upon filter query this is done to avoid
the issue of the table showing some height when the filter is applied
and there are no results

Fix: enrichment table list updated with latest design

Fix: added border to the last row when having less rows when filter is
applied or not applied

Fix: function list bottom header to take functions

Fix: function list header as per design

Fix: stream list table as per design

Fix: report list table as per new design

Fix: users list table changed as per design

Fix: added filter check for height so to avoid the issue of the table
showing some height when the filter is applied and there are no results

Fix: service account list table changed as per design

Fix: organization list table updated as per design

Fix: user groups as per design with app table additional props

Fix: app roles tables list updated as per design

Fix: made group roles virtual scroll to false

Fix: group users, roles, service accounts tables as per new design
system

Fix: search icon in IAM tables as per design

Fix: search history table update as per new design

Fix: search scheduler list table updated as per design

Fix: space between app tabs and search in log stream page

Fix: pagination logic modified due to pagination component introduced

Fix: aggregation to streaming aggregation label change in management
page

Fix: change sub text for streaming aggregation in management page

Fix: q-toggle for dark mode

Fix: report list added additional checks

Fix: alert destination table as per design

Fix: destination list, template list tables updated as per design

Fix: cipher keys table as per design

Fix: regex pattern list updated as per design

Fix: search input placeholder text fixed

Fix: per page options consistent with streams page

Fix: import and pipeline editor buttons changed as per design

Fix: added primary and secondary buttons in all listing pages

Fix: increased pipeline editor height

Fix: add stream in pipeline should not have more space in x direction

Fix: secondary, primary, and delete buttons modified in pipeline nodes

Fix: IAM add pages in sync

Fix: introduce toggle button in the entire application

Fix: alert folder list made sticky top title and search input

Fix: import alert primary and secondary button changed

Fix: action scripts table modified as per design

Fix: add action script file changed

Fix: add enrichment table submit and cancel at start

Fix: add stream submit and cancel buttons at start

Fix: create report changed as per new design

Fix: real user monitoring get started button

Fix: data source page reset rum token, reset token to primary button

Fix: add destination button position changed

Fix: add cipher key UI modified according to add report

Fix: organization settings toggle changed

Fix: home view layout spacing fixed

Fix: remove negative bg for delete button`


___

### **PR Type**
Enhancement


___

### **Description**
- Adopt new design system across tables

- Introduce uniform sticky headers/footers

- Replace filters with tabs and styled inputs

- Improve pagination, per-page options


___

### Diagram Walkthrough


```mermaid
flowchart LR
  design["New design tokens/components"]
  tables["Tables (Lists across app)"]
  headers["Sticky headers/footers"]
  filters["Tabs + styled search"]
  pagination["Unified pagination options"]
  ux["Consistent UX across themes"]

  design -- applied to --> tables
  tables -- enable --> headers
  tables -- replace --> filters
  tables -- standardize --> pagination
  tables -- results in --> ux
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><details><summary>19
files</summary><table>
<tr>
<td><strong>LogStream.vue</strong><dd><code>Header redesign, tabs,
sticky table, pagination</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-56f4223b74568c10bc305741cc9fc3a8830184a251b4eaa6a2649033bc6200e3">+82/-95</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>AlertList.vue</strong><dd><code>Header styling,
search/toggle redesign, sticky table</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-be3e41b823e163b226ffc270d95cc4981e59c600851e4e0d10ee5e4ee994ac8e">+59/-62</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>ActionScipts.vue</strong><dd><code>Styled header/search,
computed filtering, sticky table</code>&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-6cfeff0b8dbbaba52b13ba67d6f4f8fdc3c58996eccdfae2ad0db2e7aee20f08">+71/-65</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>User.vue</strong><dd><code>New header/search, client
filtering, footer pagination</code>&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-e973c2a665f9b27b94673ba64cc5b23650300836a727a2e07673c8e26305aee5">+63/-53</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>HomeView.vue</strong><dd><code>Card layout spacing and
grouping tweaks</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-9af441af191d3254ef5f9db603dca75486de7638cda41a3c050e7b3c33d68280">+110/-109</a></td>

</tr>

<tr>
<td><strong>ServiceAccountsList.vue</strong><dd><code>New header/search,
client filter, sticky table/footer</code>&nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-3afe835bcfbec3fda2e9550850c29581092ee0717e7dd8de8888e774a0048d24">+63/-59</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>General.vue</strong><dd><code>Platform settings UX revamp
with GroupHeader</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-a191d0eb2843df5efa7f18d411a216e86558b49f7b6cdfa9501d69414b933fc3">+144/-63</a></td>

</tr>

<tr>
<td><strong>PipelinesList.vue</strong><dd><code>Header/tabs/search
restyle, sticky table, export button</code>&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-85e3ef322f3eea0fc6d74d89431ba338a1153cb82ee06bef0f7c5f439c04267d">+52/-31</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>EnrichmentTableList.vue</strong><dd><code>Header/search
restyle, client filtering, sticky table</code>&nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-6a29e253f59405d3c0f756dba36afd7483f10ad86927cbbc3348ede6372c3077">+45/-38</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>TemplateList.vue</strong><dd><code>Header/search/buttons
restyle, sticky table/footer</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-7df66364d7d69a26cfa25cbc555d0e090c2f73e51c8386d9b0435bae4412564c">+43/-43</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>FunctionList.vue</strong><dd><code>Header/search restyle,
client filtering, sticky table</code>&nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-6ff9af50a1597504b7f0dca91e61cf30c800b4a17b4be2ed2c3a4f7a7b2d7068">+49/-39</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>ReportList.vue</strong><dd><code>Header/tabs/search restyle,
sticky table/footer, filters</code>&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-f7d700f7e67fbaba3c58ab5d2c614925db743101828214445ce9dae35dc29067">+38/-32</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>ExternalDestination.vue</strong><dd><code>Form controls
restyle, large toggles, delete node dialog</code>&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-7ed6a9ef676d7d6db5440d4157512f731bad58716c351ca39015125a8a9d2df5">+74/-15</a>&nbsp;
</td>

</tr>

<tr>

<td><strong>AlertsDestinationList.vue</strong><dd><code>Header/search/buttons
restyle, sticky table/footer</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-e9d05ba6c071c0e2f5d9ef7acdef757f79910abd6897b29e27b069a10d4ba8de">+43/-41</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>GroupHeader.vue</strong><dd><code>New shared section header
component</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-63133a31279f4f8d5631b5d33f5b12927f9dc6616b714e8c0ffc727696abbc2b">+64/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>_variables.scss</strong><dd><code>Introduce/adjust design
tokens and variables</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-b3e37ee00c17b89ad1177c5592504277aa645b374095c065ea8b3782df5e89a2">+289/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>RegexPatternList.vue</strong><dd><code>Apply unified
table/header/search styles</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-524927acd9f5bb07b71bfac489e747470108574e21a6dde63ea7c1f219cea853">+62/-56</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>CipherKeys.vue</strong><dd><code>Apply unified
table/header/search styles</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-950b715cff2c964d8542512692030c370733b57d698abf40e1dcb3cce2cfaf7a">+45/-45</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>PipelinesDestinationList.vue</strong><dd><code>Apply unified
table/header/search styles</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-088c66f5a34e73a5350a794a772e5d905262277337c937dd36f4295072203ebf">+41/-39</a>&nbsp;
</td>

</tr>

</table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>1
files</summary><table>
<tr>
<td><strong>TemplateList.spec.ts</strong><dd><code>Update tests to match
new UI structure</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-83d9701e7e491fb1ac667d1e1833ec58153c04ad844560778d06d50b85bd4bc6">+0/-20</a>&nbsp;
&nbsp; </td>

</tr>
</table></details></td></tr><tr><td><strong>Additional
files</strong></td><td><details><summary>54 files</summary><table>
<tr>
  <td><strong>alertTemplatesPage.js</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-f4ebd248b2140051e74dbbbd1aabe344f01c80704ce5857e9c28a04350e018f3">+17/-17</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>alertsPage.js</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-79ee01d6d7f145f19207b93b87143b545a1188cfc6a82bc8c45fecfbf68f8a1d">+5/-5</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>dashboard-chart.js</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-573a312576fce62d8e14f2bbb5f9b7d9a552d746304dce3d79862edddd24de76">+3/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>AppTable.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-efcf66a9e913b5d3a7c2eea800b7f4e54d9e5268307131482fd40f32e2074d8e">+30/-13</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>EditScript.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-bf406d8f31f66d50e11b2c41f5ec13daabb4bb2e4f4612c5ff44675817ed2eca">+37/-34</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AddAlert.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-7b426bb23e9ed0250c3877d6d97b099c42b2d20e22ddf4459915381b2233a0a8">+12/-10</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AddDestination.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-61b295458e13049a538f5014124855d58dce664dfbd644b57a964a37a07b7a3f">+15/-12</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AddTemplate.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-2508a43827e6b35c07f3222deebd9945101ca6bc32b9dc592e6253ab99908bba">+11/-11</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>ImportAlert.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-0f40dbf2757672e39ad16b86dddc59b568ca2e6ca36850420cd7be617da12d38">+6/-6</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>ImportDestination.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-814b8ef1dbb4eebca9dfab72452d9a90d5f3fa5886dea8e82ac0bde44f66b445">+6/-6</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>ImportTemplate.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-d22684c5142a49b8925a9dba1ef67631128caa95de66e71ba2a5b8120a0b91c6">+7/-6</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>ScheduledAlert.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-5e143a17ab0fa5d7817f6d9301667fb5597236f27184248c7a71728e85b8d999">+6/-4</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>VariablesInput.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-23a647aa1acfc95bc726629f0daa54005e3da1ed5b16482ceccef0649f680a74">+8/-11</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>AddCipherKey.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-ff5ae3a9b070fe2b3650f177ced0d87e9449ae7375a0b117ee299238293df110">+27/-15</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AddFolder.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-41d2f8fac44084c004d8386ea4cc32e9c5d3e33266c4009cc855e57fb00a41af">+12/-14</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>FolderList.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-b97284b1720dfb524e425f49acd70f1a4e59da3d493eb2d4b3de8551b2da7141">+47/-22</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AddEnrichmentTable.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-9aad551dbc051edfdb3994a664506ed6d5e27dcb64f9c2fa917b02e51a35d86e">+12/-10</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>FunctionsToolbar.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-8283d2ff9c4a66b4b59eac306672aca2d54655a462e2ddb88e14e039d79dcdaf">+18/-18</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AddGroup.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-dd49436305aadc01990cd6d9ea0abf97b964195920a1b49e64e8868fcc8afa6c">+19/-23</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AppGroups.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-402fb2a5338e60fdc3da489f4d50b5cf52f06b4e884a6fe7b82441c9fa5ea22c">+33/-22</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>EditGroup.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-6be040722d1492644adbf65250d44d28be37614d34600a73f74c816138727a40">+2/-2</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>GroupRoles.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-d7d1d9ec26ff77175b0e961e3e53e7ced45c9211eae8a0c00f7ac1cdac88ae14">+21/-8</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>GroupServiceAccounts.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-b7afafc6b850c2d6edc2b855e78ff51d95d101937ec001a5790d130f4fb60695">+18/-7</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>GroupUsers.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-114c767db76d4a09278c765d8aba39a1936c861488f39e7f0f6b3883499a3c40">+17/-6</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>AddUpdateOrganization.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-bca5bebfa6d5f435715dc5fa948876de02fef95a84e3e663e5c7922d601b4b9d">+19/-20</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>ListOrganizations.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-572ed99323d3e36d126074eccc10b68f6eef983d92f89d06b205fef0925c93a3">+30/-37</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>Quota.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-30293eb5cb924f95356d5abd4588ce0f03765ac9d4446cf5b8cbacba23c6f979">+13/-9</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>AddRole.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-fca7dd7f91da83de52bfc40e82451a8756001af43974d592de2e03a815b21c9b">+14/-14</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AppRoles.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-191634ef09436199f91f442968110a01f54ae46b5ceee67476f52613ad796db4">+27/-17</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>EditRole.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-263b6bc7d29fdf8358c8437cd637f1350aa3733cc2706eae8ff00028686cc0f5">+3/-3</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>AddServiceAccount.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-4e6840978e90be9195797d1b73b6cd1545ddac45cef84aa08701a9d66013c61b">+26/-28</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AddUser.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-47543c0488c8cb5bcf77e2bb4af9d0a5dd249993cd9577c4852f7950c7aaec91">+18/-26</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AddStream.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-78b8c84a558e60d942bacffee365633d074042e464be465eb6984b0ee5df82b9">+11/-12</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>ImportPipeline.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-d57fa41169daa44551a181f21ca33882004b29ab74e3040e4c56a8c849078670">+10/-12</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AssociateFunction.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-24a5b2df69327a6477227ea674939dea19dd6d393b4bfcf807089d71e6391152">+25/-18</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>Condition.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-4c3e624233c9e0355c7ded3b26dc74971b867be63e24f92a5e639284f60639dd">+20/-17</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>ScheduledPipeline.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-63d8f838bb880356e7804b4a57fd9223d4f2c189de7aadc7cf33cba723b29aaf">+21/-19</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>Stream.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-1a17ced9dc89022502cab0a6f9b97b413c2a2c4f8219733d063fc0180d361739">+26/-21</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>PipelineEditor.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-68c21f647336067eb79737ce9aca2d49632f2fa1c0878bcfdae55607e3473a15">+21/-19</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>StreamSelection.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-461440be35cc15b6b78700c8a61747ea9fb601a750af5292fa2d04b6fc96d595">+10/-10</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>CreateReport.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-cf2258c64249d4f28b2a103558bce3af1c87f0b2f23fe0652b458b8c20bb9c64">+28/-30</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>AddRegexPattern.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-a3783cfbdd32609bfff45ecfa23542854cad7ae60c3d29fedb832312a4de03dc">+9/-12</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>ImportRegexPattern.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-e8e1bcb5a02311504d7d571090eab27a270aaa71cae185ad2703023e2e70a31e">+6/-6</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>OrganizationManagement.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-21e2431538cb6b76e5ef5b367c6df8fc02ad8f6c1294f438be9937c7481ea9ff">+16/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>OrganizationSettings.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-54860a5d84362fe3ade0c3a50d7bacb02af3d21e1012517a0140e21f9ddabfc1">+11/-13</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>FilterCreatorPopup.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-7fa80f0424ed3b2e60b0e3ba77493b0e5d3ef98ddcf40cd103fe433d326221d7">+16/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>en.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-892aa3d75ab6e129ef9116aa21bec1b9a15ba69ce5366d2a19128078c690d824">+5/-3</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>SearchHistory.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-9dd167bd5e272b2057f53c16b905047eec00655a3552daad240a964d67a6f56d">+30/-18</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>SearchSchedulersList.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-0c0a4097c53f07712d35562b1336602bf24faddedab77a9f5717f5582dcac2f1">+53/-27</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>app.scss</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-5703d12504b0395cbfbbfad02a592bc391496026e5f03743102ce06c210ea05f">+414/-8</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>Functions.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-ad825ec1b8d58aec9bf5d2553ea09394a30b22ac59d708bcf9e56168ca1daaf6">+1/-2</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>IdentityAccessManagement.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-60b63024c98ee8927e12f9ebec93e99ba7ff419038cfe1cc57d49de1f6f342d6">+1/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>Ingestion.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-97b8e8ed2a1260a39442563c7447d4f6d4830a37d47258920d6f94a292cd2d77">+9/-9</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>RealUserMonitoring.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8033/files#diff-dd099485ccafdabc8f9e63bf1610e7044680f3b7ae19a9e9c5645b351c7a8701">+3/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></details></td></tr></tr></tbody></table>

</details>

___

---------

Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
Co-authored-by: ktx-akshay <akshay.patil@kiara.tech>
2025-09-11 18:09:38 +05:30

277 lines
7.2 KiB
Vue

<!-- Copyright 2023 OpenObserve Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<!--
Create a table like SearchResults.vue component.
1. Props for columns, rows and loading
2. use virtual scroll
3. Column should have boolean property to close column. closable: true
4. Column should have boolean property to hide column. hidden: true
5. Component should have highlight property to highlight search text
6. Rows should have boolean property to expand row. expandable: true
-->
<div :style="{ height: height, marginTop: 0 }" class="app-table-container">
<q-table
flat
:bordered="bordered"
ref="qTableRef"
:rows="rows"
:columns="columns as []"
:table-colspan="9"
row-key="index"
:virtual-scroll="virtualScroll"
:virtual-scroll-item-size="48"
:rows-per-page-options="[0]"
:pagination="_pagination"
:hide-header="hideHeader"
:filter="filter && filter.value"
:filter-method="filter && filter.method"
@virtual-scroll="onScroll"
:style="tableStyle"
>
<template #no-data>
<NoData class="q-mb-lg" />
</template>
<template v-slot:header="props">
<q-tr :props="props" class="thead-sticky">
<q-th
v-for="col in props.cols"
:key="col.name"
:class="col.classes || ''"
:props="props"
:style="col.style"
>
{{ col.label }}
</q-th>
</q-tr>
</template>
<template #top="scope" v-if="!hideTopPagination">
<div class="tw-flex tw-items-center tw-justify-between tw-w-full q-py-xs ">
<span class="tw-font-bold tw-text-[14px] tw-w-full q-pa-none">
{{ rows.length }} {{ title }}
</span>
<QTablePagination
:scope="scope"
:resultTotal="resultTotal"
:perPageOptions="perPageOptions"
position="top"
@update:changeRecordPerPage="changePagination"
style="padding: 0px;"
/>
</div>
</template>
<template v-slot:body="props">
<q-tr :props="props" :key="`m_${props.row.index}`">
<q-td
v-for="col in props.cols"
:class="col.class || ''"
:key="col.name"
:props="props"
@click="handleDataClick(col.name, props.row)"
>
<template v-if="col.slot">
<slot
:name="col.slotName"
:column="{ ...props }"
:columnName="col.name"
/>
</template>
<template v-else-if="col.type === 'action'">
<q-icon :name="col.icon" size="24px" class="cursor-pointer" />
</template>
<template v-else>
{{ col.value }}
</template>
</q-td>
</q-tr>
<q-tr
v-show="props.row.expand"
:props="props"
:key="`e_${props.row.index + 'entity'}`"
class="q-virtual-scroll--with-prev"
style="transition: display 2s ease-in"
>
<q-td colspan="100%" style="padding: 0; border-bottom: none">
<slot :name="props.row.slotName" :row="props" />
</q-td>
</q-tr>
</template>
<template #bottom="scope">
<div class="tw-flex tw-items-center tw-justify-between tw-w-full tw-h-[48px]">
<div v-if="showBottomPaginationWithTitle" class="o2-table-footer-title tw-flex tw-items-center tw-w-[200px] tw-mr-md">
{{ resultTotal }} {{ title }}
</div>
<QTablePagination
:scope="scope"
:position="'bottom'"
:resultTotal="resultTotal"
:perPageOptions="perPageOptions"
@update:changeRecordPerPage="changePagination"
/>
</div>
</template>
</q-table>
</div>
</template>
<script setup lang="ts">
import type { QTable } from "quasar";
import type { Ref } from "vue";
import { ref } from "vue";
import QTablePagination from "@/components/shared/grid/Pagination.vue";
import { computed,watch } from "vue";
import NoData from "./shared/grid/NoData.vue";
const props = defineProps({
columns: {
type: Array,
required: true,
},
rows: {
type: Array,
required: true,
},
loading: {
type: Boolean,
required: false,
default: false,
},
highlight: {
type: Boolean,
required: false,
default: false,
},
highlightText: {
type: String,
default: "",
},
title: {
type: String,
default: "",
},
virtualScroll: {
type: Boolean,
default: true,
},
height: {
type: String,
default: "100%",
},
pagination: {
type: Boolean,
default: false,
},
rowsPerPage: {
type: Number,
default: 20,
},
dense: {
type: Boolean,
default: false,
},
hideHeader: {
type: Boolean,
default: false,
},
filter: {
type: Object,
default: () => null,
},
bordered: {
type: Boolean,
default: true,
},
tableStyle: {
type: String,
default: "",
},
hideTopPagination: {
type: Boolean,
default: false,
},
showBottomPaginationWithTitle: {
type: Boolean,
default: false,
},
});
const emit = defineEmits(["event-emitted"]);
const perPageOptions: any = [
{ label: "20", value: 20 },
{ label: "50", value: 50 },
{ label: "100", value: 100 },
{ label: "250", value: 250 },
{ label: "500", value: 500 }
];
const resultTotal = ref<number>(0);
const selectedPerPage = ref<number>(20);
const qTableRef: Ref<InstanceType<typeof QTable> | null> = ref(null);
const showPagination = computed(() => {
return props.pagination;
});
const _pagination: any = ref({
rowsPerPage: props.rowsPerPage,
});
const changePagination = (val: { label: string; value: any }) => {
selectedPerPage.value = val.value;
_pagination.value.rowsPerPage = val.value;
qTableRef.value?.setPagination(_pagination.value);
};
const handleDataClick = (columnName: string, row: any) => {
emit("event-emitted", "cell-click", { columnName, row });
};
const onScroll = (e: any) => {
try {
emit("event-emitted", "scroll", e);
} catch (e) {
console.log("error", e);
}
};
watch(
() => props.rows,
(newRows) => {
resultTotal.value = newRows.length;
},
{ immediate: true } // Ensures it runs on initial load
);
</script>
<style lang="scss">
.app-table-container {
.thead-sticky,
.tfoot-sticky {
position: sticky;
top: 0;
opacity: 1;
z-index: 1;
}
.q-table__bottom {
.q-table__control {
padding-top: 0;
padding-bottom: 0;
}
}
}
</style>