mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-04 16:09:05 +00:00
### **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> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-56f4223b74568c10bc305741cc9fc3a8830184a251b4eaa6a2649033bc6200e3">+82/-95</a> </td> </tr> <tr> <td><strong>AlertList.vue</strong><dd><code>Header styling, search/toggle redesign, sticky table</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-be3e41b823e163b226ffc270d95cc4981e59c600851e4e0d10ee5e4ee994ac8e">+59/-62</a> </td> </tr> <tr> <td><strong>ActionScipts.vue</strong><dd><code>Styled header/search, computed filtering, sticky table</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-6cfeff0b8dbbaba52b13ba67d6f4f8fdc3c58996eccdfae2ad0db2e7aee20f08">+71/-65</a> </td> </tr> <tr> <td><strong>User.vue</strong><dd><code>New header/search, client filtering, footer pagination</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-e973c2a665f9b27b94673ba64cc5b23650300836a727a2e07673c8e26305aee5">+63/-53</a> </td> </tr> <tr> <td><strong>HomeView.vue</strong><dd><code>Card layout spacing and grouping tweaks</code> </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> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-3afe835bcfbec3fda2e9550850c29581092ee0717e7dd8de8888e774a0048d24">+63/-59</a> </td> </tr> <tr> <td><strong>General.vue</strong><dd><code>Platform settings UX revamp with GroupHeader</code> </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> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-85e3ef322f3eea0fc6d74d89431ba338a1153cb82ee06bef0f7c5f439c04267d">+52/-31</a> </td> </tr> <tr> <td><strong>EnrichmentTableList.vue</strong><dd><code>Header/search restyle, client filtering, sticky table</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-6a29e253f59405d3c0f756dba36afd7483f10ad86927cbbc3348ede6372c3077">+45/-38</a> </td> </tr> <tr> <td><strong>TemplateList.vue</strong><dd><code>Header/search/buttons restyle, sticky table/footer</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-7df66364d7d69a26cfa25cbc555d0e090c2f73e51c8386d9b0435bae4412564c">+43/-43</a> </td> </tr> <tr> <td><strong>FunctionList.vue</strong><dd><code>Header/search restyle, client filtering, sticky table</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-6ff9af50a1597504b7f0dca91e61cf30c800b4a17b4be2ed2c3a4f7a7b2d7068">+49/-39</a> </td> </tr> <tr> <td><strong>ReportList.vue</strong><dd><code>Header/tabs/search restyle, sticky table/footer, filters</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-f7d700f7e67fbaba3c58ab5d2c614925db743101828214445ce9dae35dc29067">+38/-32</a> </td> </tr> <tr> <td><strong>ExternalDestination.vue</strong><dd><code>Form controls restyle, large toggles, delete node dialog</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-7ed6a9ef676d7d6db5440d4157512f731bad58716c351ca39015125a8a9d2df5">+74/-15</a> </td> </tr> <tr> <td><strong>AlertsDestinationList.vue</strong><dd><code>Header/search/buttons restyle, sticky table/footer</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-e9d05ba6c071c0e2f5d9ef7acdef757f79910abd6897b29e27b069a10d4ba8de">+43/-41</a> </td> </tr> <tr> <td><strong>GroupHeader.vue</strong><dd><code>New shared section header component</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-63133a31279f4f8d5631b5d33f5b12927f9dc6616b714e8c0ffc727696abbc2b">+64/-0</a> </td> </tr> <tr> <td><strong>_variables.scss</strong><dd><code>Introduce/adjust design tokens and variables</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-b3e37ee00c17b89ad1177c5592504277aa645b374095c065ea8b3782df5e89a2">+289/-0</a> </td> </tr> <tr> <td><strong>RegexPatternList.vue</strong><dd><code>Apply unified table/header/search styles</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-524927acd9f5bb07b71bfac489e747470108574e21a6dde63ea7c1f219cea853">+62/-56</a> </td> </tr> <tr> <td><strong>CipherKeys.vue</strong><dd><code>Apply unified table/header/search styles</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-950b715cff2c964d8542512692030c370733b57d698abf40e1dcb3cce2cfaf7a">+45/-45</a> </td> </tr> <tr> <td><strong>PipelinesDestinationList.vue</strong><dd><code>Apply unified table/header/search styles</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-088c66f5a34e73a5350a794a772e5d905262277337c937dd36f4295072203ebf">+41/-39</a> </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> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8033/files#diff-83d9701e7e491fb1ac667d1e1833ec58153c04ad844560778d06d50b85bd4bc6">+0/-20</a> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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>
277 lines
7.2 KiB
Vue
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>
|