datajunction-ui 0.0.1-rc.24 → 0.0.1-rc.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.env +1 -0
  2. package/package.json +3 -2
  3. package/src/app/components/Tab.jsx +0 -1
  4. package/src/app/constants.js +2 -2
  5. package/src/app/icons/LoadingIcon.jsx +14 -0
  6. package/src/app/index.tsx +11 -1
  7. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormFailed.test.jsx +28 -2
  8. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormSuccess.test.jsx +44 -9
  9. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormFailed.test.jsx.snap +1 -0
  10. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormSuccess.test.jsx.snap +0 -50
  11. package/src/app/pages/AddEditNodePage/__tests__/index.test.jsx +2 -0
  12. package/src/app/pages/AddEditNodePage/index.jsx +60 -6
  13. package/src/app/pages/AddEditTagPage/Loadable.jsx +16 -0
  14. package/src/app/pages/AddEditTagPage/__tests__/AddEditTagPage.test.jsx +107 -0
  15. package/src/app/pages/AddEditTagPage/index.jsx +132 -0
  16. package/src/app/pages/LoginPage/LoginForm.jsx +124 -0
  17. package/src/app/pages/LoginPage/SignupForm.jsx +156 -0
  18. package/src/app/pages/LoginPage/__tests__/index.test.jsx +34 -2
  19. package/src/app/pages/LoginPage/index.jsx +9 -82
  20. package/src/app/pages/NamespacePage/index.jsx +5 -0
  21. package/src/app/pages/NodePage/AddBackfillPopover.jsx +166 -0
  22. package/src/app/pages/NodePage/AddMaterializationPopover.jsx +161 -0
  23. package/src/app/pages/NodePage/EditColumnPopover.jsx +1 -1
  24. package/src/app/pages/NodePage/LinkDimensionPopover.jsx +0 -1
  25. package/src/app/pages/NodePage/NodeColumnTab.jsx +102 -25
  26. package/src/app/pages/NodePage/NodeInfoTab.jsx +33 -23
  27. package/src/app/pages/NodePage/NodeMaterializationTab.jsx +158 -99
  28. package/src/app/pages/NodePage/PartitionColumnPopover.jsx +153 -0
  29. package/src/app/pages/NodePage/__tests__/AddBackfillPopover.test.jsx +47 -0
  30. package/src/app/pages/NodePage/__tests__/NodePage.test.jsx +47 -17
  31. package/src/app/pages/NodePage/__tests__/__snapshots__/NodePage.test.jsx.snap +101 -100
  32. package/src/app/pages/RegisterTablePage/__tests__/__snapshots__/RegisterTablePage.test.jsx.snap +1 -0
  33. package/src/app/pages/Root/index.tsx +1 -1
  34. package/src/app/pages/TagPage/Loadable.jsx +16 -0
  35. package/src/app/pages/TagPage/__tests__/TagPage.test.jsx +70 -0
  36. package/src/app/pages/TagPage/index.jsx +79 -0
  37. package/src/app/services/DJService.js +166 -1
  38. package/src/app/services/__tests__/DJService.test.jsx +196 -1
  39. package/src/mocks/mockNodes.jsx +64 -31
  40. package/src/styles/dag.css +4 -0
  41. package/src/styles/index.css +89 -1
  42. package/src/styles/loading.css +34 -0
  43. package/src/styles/login.css +17 -3
  44. package/src/utils/form.jsx +2 -2
@@ -28,7 +28,7 @@ describe('DataJunctionAPI', () => {
28
28
  it('calls logout correctly', async () => {
29
29
  fetch.mockResponseOnce(JSON.stringify({}));
30
30
  await DataJunctionAPI.logout();
31
- expect(fetch).toHaveBeenCalledWith(`${DJ_URL}/basic/logout/`, {
31
+ expect(fetch).toHaveBeenCalledWith(`${DJ_URL}/logout/`, {
32
32
  credentials: 'include',
33
33
  method: 'POST',
34
34
  });
@@ -606,4 +606,199 @@ describe('DataJunctionAPI', () => {
606
606
  },
607
607
  );
608
608
  });
609
+
610
+ it('calls addNamespace correctly', async () => {
611
+ fetch.mockResponseOnce(JSON.stringify({}));
612
+ await DataJunctionAPI.addNamespace('test');
613
+ expect(fetch).toHaveBeenCalledWith(`${DJ_URL}/namespaces/test`, {
614
+ credentials: 'include',
615
+ headers: {
616
+ 'Content-Type': 'application/json',
617
+ },
618
+ method: 'POST',
619
+ });
620
+ });
621
+
622
+ it('calls listTags correctly', async () => {
623
+ fetch.mockResponseOnce(JSON.stringify(mocks.tags));
624
+ const res = await DataJunctionAPI.listTags();
625
+ expect(fetch).toHaveBeenCalledWith(`${DJ_URL}/tags`, {
626
+ credentials: 'include',
627
+ headers: {
628
+ 'Content-Type': 'application/json',
629
+ },
630
+ method: 'GET',
631
+ });
632
+ expect(res).toEqual(mocks.tags);
633
+ });
634
+
635
+ it('calls getTag correctly', async () => {
636
+ fetch.mockResponseOnce(JSON.stringify(mocks.tags[0]));
637
+ const res = await DataJunctionAPI.getTag('report.financials');
638
+ expect(fetch).toHaveBeenCalledWith(`${DJ_URL}/tags/report.financials`, {
639
+ credentials: 'include',
640
+ headers: {
641
+ 'Content-Type': 'application/json',
642
+ },
643
+ method: 'GET',
644
+ });
645
+ expect(res).toEqual(mocks.tags[0]);
646
+ });
647
+
648
+ it('calls listNodesForTag correctly', async () => {
649
+ fetch.mockResponseOnce(JSON.stringify(mocks.mockLinkedNodes));
650
+ const res = await DataJunctionAPI.listNodesForTag('report.financials');
651
+ expect(fetch).toHaveBeenCalledWith(
652
+ `${DJ_URL}/tags/report.financials/nodes`,
653
+ {
654
+ credentials: 'include',
655
+ headers: {
656
+ 'Content-Type': 'application/json',
657
+ },
658
+ method: 'GET',
659
+ },
660
+ );
661
+ expect(res).toEqual(mocks.mockLinkedNodes);
662
+ });
663
+
664
+ it('calls tagsNode correctly', async () => {
665
+ fetch.mockResponseOnce(JSON.stringify(mocks.mockLinkedNodes));
666
+ await DataJunctionAPI.tagsNode('default.num_repair_orders', [
667
+ 'report.financials',
668
+ 'report.forecasts',
669
+ ]);
670
+ expect(fetch).toHaveBeenCalledWith(
671
+ `${DJ_URL}/nodes/default.num_repair_orders/tags?tag_names=report.financials&tag_names=report.forecasts`,
672
+ {
673
+ credentials: 'include',
674
+ headers: {
675
+ 'Content-Type': 'application/json',
676
+ },
677
+ method: 'POST',
678
+ },
679
+ );
680
+ });
681
+
682
+ it('calls addTag correctly', async () => {
683
+ fetch.mockResponseOnce(JSON.stringify(mocks.mockLinkedNodes));
684
+ await DataJunctionAPI.addTag(
685
+ 'report.financials',
686
+ 'Financial Reports',
687
+ 'report',
688
+ 'financial reports',
689
+ );
690
+ expect(fetch).toHaveBeenCalledWith(`${DJ_URL}/tags`, {
691
+ credentials: 'include',
692
+ headers: {
693
+ 'Content-Type': 'application/json',
694
+ },
695
+ body: JSON.stringify({
696
+ name: 'report.financials',
697
+ display_name: 'Financial Reports',
698
+ tag_type: 'report',
699
+ description: 'financial reports',
700
+ }),
701
+ method: 'POST',
702
+ });
703
+ });
704
+
705
+ it('calls editTag correctly', async () => {
706
+ fetch.mockResponseOnce(JSON.stringify({}));
707
+ await DataJunctionAPI.editTag(
708
+ 'report.financials',
709
+ 'Financial reports',
710
+ 'Financial Reports',
711
+ );
712
+ expect(fetch).toHaveBeenCalledWith(`${DJ_URL}/tags/report.financials`, {
713
+ credentials: 'include',
714
+ headers: {
715
+ 'Content-Type': 'application/json',
716
+ },
717
+ body: JSON.stringify({
718
+ description: 'Financial reports',
719
+ display_name: 'Financial Reports',
720
+ }),
721
+ method: 'PATCH',
722
+ });
723
+ });
724
+
725
+ it('calls setPartition correctly', async () => {
726
+ fetch.mockResponseOnce(JSON.stringify({}));
727
+ await DataJunctionAPI.setPartition(
728
+ 'default.hard_hat',
729
+ 'hire_date',
730
+ 'temporal',
731
+ 'yyyyMMdd',
732
+ 'day',
733
+ );
734
+ expect(fetch).toHaveBeenCalledWith(
735
+ `${DJ_URL}/nodes/default.hard_hat/columns/hire_date/partition`,
736
+ {
737
+ credentials: 'include',
738
+ headers: {
739
+ 'Content-Type': 'application/json',
740
+ },
741
+ body: JSON.stringify({
742
+ type_: 'temporal',
743
+ format: 'yyyyMMdd',
744
+ granularity: 'day',
745
+ }),
746
+ method: 'POST',
747
+ },
748
+ );
749
+ });
750
+
751
+ it('calls materialize correctly', async () => {
752
+ fetch.mockResponseOnce(JSON.stringify({}));
753
+ await DataJunctionAPI.materialize(
754
+ 'default.hard_hat',
755
+ 'spark',
756
+ '3.3',
757
+ '@daily',
758
+ '{}',
759
+ );
760
+ expect(fetch).toHaveBeenCalledWith(
761
+ `${DJ_URL}/nodes/default.hard_hat/materialization`,
762
+ {
763
+ credentials: 'include',
764
+ headers: {
765
+ 'Content-Type': 'application/json',
766
+ },
767
+ body: JSON.stringify({
768
+ engine: {
769
+ name: 'spark',
770
+ version: '3.3',
771
+ },
772
+ schedule: '@daily',
773
+ config: {},
774
+ }),
775
+ method: 'POST',
776
+ },
777
+ );
778
+ });
779
+
780
+ it('calls runBackfill correctly', async () => {
781
+ fetch.mockResponseOnce(JSON.stringify({}));
782
+ await DataJunctionAPI.runBackfill(
783
+ 'default.hard_hat',
784
+ 'spark',
785
+ 'hire_date',
786
+ '20230101',
787
+ '20230202',
788
+ );
789
+ expect(fetch).toHaveBeenCalledWith(
790
+ `${DJ_URL}/nodes/default.hard_hat/materializations/spark/backfill`,
791
+ {
792
+ credentials: 'include',
793
+ headers: {
794
+ 'Content-Type': 'application/json',
795
+ },
796
+ body: JSON.stringify({
797
+ column_name: 'hire_date',
798
+ range: ['20230101', '20230202'],
799
+ }),
800
+ method: 'POST',
801
+ },
802
+ );
803
+ });
609
804
  });
@@ -27,8 +27,10 @@ export const mocks = {
27
27
  {
28
28
  name: 'default_DOT_num_repair_orders',
29
29
  type: 'bigint',
30
+ display_name: 'Default DOT num repair orders',
30
31
  attributes: [],
31
32
  dimension: null,
33
+ partition: null,
32
34
  },
33
35
  ],
34
36
  primary_key: ['repair_order_id', 'country'],
@@ -40,7 +42,7 @@ export const mocks = {
40
42
  },
41
43
  ],
42
44
  created_at: '2023-08-21T16:48:56.841631+00:00',
43
- tags: [],
45
+ tags: [{ name: 'purpose', display_name: 'Purpose' }],
44
46
  dimensions: [
45
47
  {
46
48
  value: 'default.date_dim.dateint',
@@ -243,8 +245,10 @@ export const mocks = {
243
245
  {
244
246
  name: 'default_DOT_avg_repair_price',
245
247
  type: 'double',
248
+ display_name: 'Default DOT avg repair price',
246
249
  attributes: [],
247
250
  dimension: null,
251
+ partition: null,
248
252
  },
249
253
  ],
250
254
  metricNodeHistory: [
@@ -336,32 +340,19 @@ export const mocks = {
336
340
  ],
337
341
  nodeMaterializations: [
338
342
  {
343
+ backfills: [
344
+ {
345
+ spec: {
346
+ column_name: 'default_DOT_hard_hat_DOT_hire_date',
347
+ values: null,
348
+ range: ['20230101', '20230102'],
349
+ },
350
+ urls: [],
351
+ },
352
+ ],
339
353
  name: 'country_birth_date_contractor_id_379232101',
340
354
  engine: { name: 'spark', version: '2.4.4', uri: null, dialect: 'spark' },
341
355
  config: {
342
- partitions: [
343
- {
344
- name: 'country',
345
- values: ['DE', 'MY'],
346
- range: null,
347
- expression: null,
348
- type_: 'categorical',
349
- },
350
- {
351
- name: 'birth_date',
352
- values: null,
353
- range: [20010101, 20020101],
354
- expression: null,
355
- type_: 'temporal',
356
- },
357
- {
358
- name: 'contractor_id',
359
- values: null,
360
- range: [1, 10],
361
- expression: null,
362
- type_: 'categorical',
363
- },
364
- ],
365
356
  spark: {},
366
357
  query:
367
358
  "SELECT default_DOT_hard_hats.address,\n\tdefault_DOT_hard_hats.birth_date,\n\tdefault_DOT_hard_hats.city,\n\tdefault_DOT_hard_hats.contractor_id,\n\tdefault_DOT_hard_hats.country,\n\tdefault_DOT_hard_hats.first_name,\n\tdefault_DOT_hard_hats.hard_hat_id,\n\tdefault_DOT_hard_hats.hire_date,\n\tdefault_DOT_hard_hats.last_name,\n\tdefault_DOT_hard_hats.manager,\n\tdefault_DOT_hard_hats.postal_code,\n\tdefault_DOT_hard_hats.state,\n\tdefault_DOT_hard_hats.title \n FROM roads.hard_hats AS default_DOT_hard_hats \n WHERE default_DOT_hard_hats.country IN ('DE', 'MY') AND default_DOT_hard_hats.contractor_id BETWEEN 1 AND 10\n\n",
@@ -402,6 +393,7 @@ export const mocks = {
402
393
  {
403
394
  name: 'default_DOT_avg_repair_price',
404
395
  type: 'double',
396
+ display_name: 'Default DOT avg repair price',
405
397
  attributes: [],
406
398
  dimension: null,
407
399
  },
@@ -442,30 +434,35 @@ export const mocks = {
442
434
  {
443
435
  name: 'default_DOT_num_repair_orders',
444
436
  type: 'bigint',
437
+ display_name: 'Default DOT num repair orders',
445
438
  attributes: [],
446
439
  dimension: null,
447
440
  },
448
441
  {
449
442
  name: 'default_DOT_avg_repair_price',
450
443
  type: 'double',
444
+ display_name: 'Default DOT avg repair price',
451
445
  attributes: [],
452
446
  dimension: null,
453
447
  },
454
448
  {
455
449
  name: 'default_DOT_total_repair_cost',
456
450
  type: 'double',
451
+ display_name: 'Default DOT total repair cost',
457
452
  attributes: [],
458
453
  dimension: null,
459
454
  },
460
455
  {
461
456
  name: 'default_DOT_total_repair_order_discounts',
462
457
  type: 'double',
458
+ display_name: 'Default DOT total repair order discounts',
463
459
  attributes: [],
464
460
  dimension: null,
465
461
  },
466
462
  {
467
463
  name: 'company_name',
468
464
  type: 'string',
465
+ display_name: 'Company Name',
469
466
  attributes: [
470
467
  {
471
468
  attribute_type: {
@@ -821,6 +818,7 @@ export const mocks = {
821
818
  {
822
819
  name: 'default_DOT_avg_repair_price',
823
820
  type: 'double',
821
+ display_name: 'Default DOT avg repair price',
824
822
  attributes: [],
825
823
  dimension: null,
826
824
  },
@@ -1044,6 +1042,7 @@ export const mocks = {
1044
1042
  {
1045
1043
  name: 'repair_order_id',
1046
1044
  type: 'int',
1045
+ display_name: 'Repair Order Id',
1047
1046
  attributes: [],
1048
1047
  dimension: {
1049
1048
  name: 'default.repair_order',
@@ -1052,24 +1051,28 @@ export const mocks = {
1052
1051
  {
1053
1052
  name: 'repair_type_id',
1054
1053
  type: 'int',
1054
+ display_name: 'Repair Type Id',
1055
1055
  attributes: [],
1056
1056
  dimension: null,
1057
1057
  },
1058
1058
  {
1059
1059
  name: 'price',
1060
1060
  type: 'float',
1061
+ display_name: 'Price',
1061
1062
  attributes: [],
1062
1063
  dimension: null,
1063
1064
  },
1064
1065
  {
1065
1066
  name: 'quantity',
1066
1067
  type: 'int',
1068
+ display_name: 'Quantity',
1067
1069
  attributes: [],
1068
1070
  dimension: null,
1069
1071
  },
1070
1072
  {
1071
1073
  name: 'discount',
1072
1074
  type: 'float',
1075
+ display_name: 'Discount',
1073
1076
  attributes: [],
1074
1077
  dimension: null,
1075
1078
  },
@@ -1108,6 +1111,7 @@ export const mocks = {
1108
1111
  {
1109
1112
  name: 'dateint',
1110
1113
  type: 'timestamp',
1114
+ display_name: 'Dateint',
1111
1115
  attributes: [
1112
1116
  {
1113
1117
  attribute_type: {
@@ -1121,18 +1125,21 @@ export const mocks = {
1121
1125
  {
1122
1126
  name: 'month',
1123
1127
  type: 'int',
1128
+ display_name: 'Month',
1124
1129
  attributes: [],
1125
1130
  dimension: null,
1126
1131
  },
1127
1132
  {
1128
1133
  name: 'year',
1129
1134
  type: 'int',
1135
+ display_name: 'Year',
1130
1136
  attributes: [],
1131
1137
  dimension: null,
1132
1138
  },
1133
1139
  {
1134
1140
  name: 'day',
1135
1141
  type: 'int',
1142
+ display_name: 'Day',
1136
1143
  attributes: [],
1137
1144
  dimension: null,
1138
1145
  },
@@ -1175,6 +1182,7 @@ export const mocks = {
1175
1182
  {
1176
1183
  name: 'hard_hat_id',
1177
1184
  type: 'int',
1185
+ display_name: 'Hard Hat Id',
1178
1186
  attributes: [
1179
1187
  {
1180
1188
  attribute_type: {
@@ -1188,24 +1196,28 @@ export const mocks = {
1188
1196
  {
1189
1197
  name: 'last_name',
1190
1198
  type: 'string',
1199
+ display_name: 'Last Name',
1191
1200
  attributes: [],
1192
1201
  dimension: null,
1193
1202
  },
1194
1203
  {
1195
1204
  name: 'first_name',
1196
1205
  type: 'string',
1206
+ display_name: 'First Name',
1197
1207
  attributes: [],
1198
1208
  dimension: null,
1199
1209
  },
1200
1210
  {
1201
1211
  name: 'title',
1202
1212
  type: 'string',
1213
+ display_name: 'Title',
1203
1214
  attributes: [],
1204
1215
  dimension: null,
1205
1216
  },
1206
1217
  {
1207
1218
  name: 'birth_date',
1208
1219
  type: 'date',
1220
+ display_name: 'Birth Date',
1209
1221
  attributes: [],
1210
1222
  dimension: {
1211
1223
  name: 'default.date_dim',
@@ -1218,18 +1230,21 @@ export const mocks = {
1218
1230
  dimension: {
1219
1231
  name: 'default.date_dim',
1220
1232
  },
1233
+ display_name: 'Hire Date',
1221
1234
  },
1222
1235
  {
1223
1236
  name: 'address',
1224
1237
  type: 'string',
1225
1238
  attributes: [],
1226
1239
  dimension: null,
1240
+ display_name: 'Address',
1227
1241
  },
1228
1242
  {
1229
1243
  name: 'city',
1230
1244
  type: 'string',
1231
1245
  attributes: [],
1232
1246
  dimension: null,
1247
+ display_name: 'City',
1233
1248
  },
1234
1249
  {
1235
1250
  name: 'state',
@@ -1238,37 +1253,35 @@ export const mocks = {
1238
1253
  dimension: {
1239
1254
  name: 'default.us_state',
1240
1255
  },
1256
+ display_name: 'State',
1241
1257
  },
1242
1258
  {
1243
1259
  name: 'postal_code',
1244
1260
  type: 'string',
1245
1261
  attributes: [],
1246
1262
  dimension: null,
1263
+ display_name: 'Postal Code',
1247
1264
  },
1248
1265
  {
1249
1266
  name: 'country',
1250
1267
  type: 'string',
1251
1268
  attributes: [],
1252
1269
  dimension: null,
1270
+ display_name: 'Country',
1253
1271
  },
1254
1272
  {
1255
1273
  name: 'manager',
1256
1274
  type: 'int',
1257
1275
  attributes: [],
1258
1276
  dimension: null,
1277
+ display_name: 'Manager',
1259
1278
  },
1260
1279
  {
1261
1280
  name: 'contractor_id',
1262
1281
  type: 'int',
1263
1282
  attributes: [],
1264
1283
  dimension: null,
1265
- },
1266
- ],
1267
- updated_at: '2023-08-21T16:48:55.594603+00:00',
1268
- materializations: [],
1269
- parents: [
1270
- {
1271
- name: 'default.hard_hats',
1284
+ display_name: 'Contractor Id',
1272
1285
  },
1273
1286
  ],
1274
1287
  created_at: '2023-08-21T16:48:55.594537+00:00',
@@ -1302,6 +1315,7 @@ export const mocks = {
1302
1315
  {
1303
1316
  name: 'default_DOT_avg_repair_price',
1304
1317
  type: 'double',
1318
+ display_name: 'Default DOT avg repair price',
1305
1319
  attributes: [],
1306
1320
  dimension: null,
1307
1321
  },
@@ -1345,6 +1359,7 @@ export const mocks = {
1345
1359
  {
1346
1360
  name: 'dispatcher_id',
1347
1361
  type: 'int',
1362
+ display_name: 'Dispatcher Id',
1348
1363
  attributes: [
1349
1364
  {
1350
1365
  attribute_type: {
@@ -1358,12 +1373,14 @@ export const mocks = {
1358
1373
  {
1359
1374
  name: 'company_name',
1360
1375
  type: 'string',
1376
+ display_name: 'Company Name',
1361
1377
  attributes: [],
1362
1378
  dimension: null,
1363
1379
  },
1364
1380
  {
1365
1381
  name: 'phone',
1366
1382
  type: 'string',
1383
+ display_name: 'Phone',
1367
1384
  attributes: [],
1368
1385
  dimension: null,
1369
1386
  },
@@ -1394,4 +1411,20 @@ export const mocks = {
1394
1411
  display_name: 'Default: Num Repair Orders',
1395
1412
  },
1396
1413
  ],
1414
+ tags: [
1415
+ {
1416
+ description: 'Financial-related reports',
1417
+ display_name: 'Financial Reports',
1418
+ tag_metadata: {},
1419
+ name: 'report.financials',
1420
+ tag_type: 'reports',
1421
+ },
1422
+ {
1423
+ description: 'Forecasting reports',
1424
+ display_name: 'Forecasting Reports',
1425
+ tag_metadata: {},
1426
+ name: 'reports.forecasts',
1427
+ tag_type: 'reports',
1428
+ },
1429
+ ],
1397
1430
  };
@@ -97,6 +97,10 @@
97
97
  rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;
98
98
  }
99
99
 
100
+ .partition__full:hover {
101
+ border: solid #195039 0.025em;
102
+ }
103
+
100
104
  .partition__header,
101
105
  .partition__body,
102
106
  .partition__full,
@@ -369,6 +369,7 @@ tbody th {
369
369
  border-top: 1px solid #edf2f9;
370
370
  border-bottom: 0;
371
371
  padding: 1rem;
372
+ max-width: 25rem;
372
373
  }
373
374
  .card-inner-table td,
374
375
  .card-inner-table th {
@@ -451,6 +452,17 @@ tbody th {
451
452
  background-color: #dbafff !important;
452
453
  color: #580076;
453
454
  }
455
+
456
+ .node_type__blank {
457
+ font-family: 'Jost';
458
+ background-color: #ffffff !important;
459
+ color: #a96621;
460
+ }
461
+ .entity__tag {
462
+ font-family: 'Jost';
463
+ background-color: #afd4ff !important;
464
+ color: #002176;
465
+ }
454
466
  .react-flow__node .node_type__cube {
455
467
  background-color: #c2180750 !important;
456
468
  color: #c2180750;
@@ -710,9 +722,11 @@ pre {
710
722
  }
711
723
  .menu-title a {
712
724
  color: #7e8299;
725
+ cursor: pointer;
713
726
  }
714
727
  .menu-title a:hover {
715
728
  color: #3f4254;
729
+ cursor: pointer;
716
730
  }
717
731
 
718
732
  .node__header,
@@ -892,7 +906,33 @@ pre {
892
906
  position: absolute;
893
907
  min-width: 210px;
894
908
  max-width: 100%;
895
- z-index: 1;
909
+ z-index: 100000;
910
+ }
911
+
912
+ .centerPopover {
913
+ position: absolute !important;
914
+ top: 1%;
915
+ left: 25%;
916
+
917
+ padding: 1rem 1rem 0.6rem 1rem !important;
918
+ margin-top: 1rem;
919
+ border-radius: 10px;
920
+ text-align: left;
921
+ position: absolute;
922
+ min-width: 210px;
923
+ max-width: 100%;
924
+ z-index: 100000;
925
+ background-color: #fff;
926
+ background-clip: padding-box;
927
+ border: 1px solid rgba(0, 0, 0, 0.2);
928
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
929
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
930
+ outline: 0;
931
+ }
932
+
933
+ .centerPopover h2 {
934
+ margin-top: 0;
935
+ margin-bottom: 1rem;
896
936
  }
897
937
 
898
938
  .select-name {
@@ -993,3 +1033,51 @@ pre {
993
1033
  .deleteNode {
994
1034
  display: inline-block;
995
1035
  }
1036
+
1037
+ .tag_value {
1038
+ color: #5c3b8f;
1039
+ background-color: #5c3b8f25;
1040
+ margin: 0.25rem;
1041
+ font-size: 100%;
1042
+ }
1043
+
1044
+ .tag_value:hover {
1045
+ background-color: #5c3b8f50;
1046
+ }
1047
+
1048
+ .modal-backdrop.in {
1049
+ filter: alpha(opacity=50);
1050
+ opacity: 0.5;
1051
+ }
1052
+ .modal-backdrop.fade {
1053
+ filter: alpha(opacity=0);
1054
+ opacity: 0;
1055
+ }
1056
+ .fade.in {
1057
+ opacity: 1;
1058
+ }
1059
+ .modal-backdrop {
1060
+ z-index: 1 !important;
1061
+ }
1062
+ .modal-backdrop {
1063
+ z-index: 1;
1064
+ }
1065
+ .modal-backdrop {
1066
+ position: fixed;
1067
+ top: 0;
1068
+ right: 0;
1069
+ bottom: 0;
1070
+ left: 0;
1071
+ z-index: 1;
1072
+ background-color: #00000075;
1073
+ }
1074
+ .fade {
1075
+ opacity: 0;
1076
+ -webkit-transition: opacity 0.15s linear;
1077
+ -o-transition: opacity 0.15s linear;
1078
+ transition: opacity 0.15s linear;
1079
+ }
1080
+
1081
+ .partitionLink:hover {
1082
+ text-decoration: none;
1083
+ }
@@ -0,0 +1,34 @@
1
+ .lds-ring {
2
+ display: inline-block;
3
+ position: relative;
4
+ width: 25px;
5
+ height: 25px;
6
+ }
7
+ .lds-ring div {
8
+ box-sizing: border-box;
9
+ display: block;
10
+ position: absolute;
11
+ width: 25px;
12
+ height: 25px;
13
+ border: 8px solid #fff;
14
+ border-radius: 50%;
15
+ animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
16
+ border-color: #fff transparent transparent transparent;
17
+ }
18
+ .lds-ring div:nth-child(1) {
19
+ animation-delay: -0.45s;
20
+ }
21
+ .lds-ring div:nth-child(2) {
22
+ animation-delay: -0.3s;
23
+ }
24
+ .lds-ring div:nth-child(3) {
25
+ animation-delay: -0.15s;
26
+ }
27
+ @keyframes lds-ring {
28
+ 0% {
29
+ transform: rotate(0deg);
30
+ }
31
+ 100% {
32
+ transform: rotate(360deg);
33
+ }
34
+ }