@reldens/cms 0.19.0 → 0.21.0

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 (55) hide show
  1. package/README.md +399 -17
  2. package/admin/reldens-admin-client.css +156 -99
  3. package/admin/reldens-admin-client.js +108 -133
  4. package/admin/templates/clear-all-cache-button.html +7 -7
  5. package/admin/templates/edit.html +7 -0
  6. package/admin/templates/layout.html +15 -9
  7. package/admin/templates/list-content.html +4 -2
  8. package/admin/templates/list.html +24 -8
  9. package/admin/templates/view.html +21 -0
  10. package/lib/admin-manager/admin-filters-manager.js +177 -0
  11. package/lib/admin-manager/contents-builder.js +1 -0
  12. package/lib/admin-manager/default-translations.js +38 -0
  13. package/lib/admin-manager/router-contents.js +50 -45
  14. package/lib/admin-manager/router.js +19 -0
  15. package/lib/frontend/content-renderer.js +178 -0
  16. package/lib/frontend/entity-access-manager.js +63 -0
  17. package/lib/frontend/request-processor.js +128 -0
  18. package/lib/frontend/response-manager.js +54 -0
  19. package/lib/frontend/template-cache.js +102 -0
  20. package/lib/frontend/template-resolver.js +111 -0
  21. package/lib/frontend.js +111 -538
  22. package/lib/manager.js +26 -12
  23. package/lib/search-renderer.js +15 -7
  24. package/lib/search-request-handler.js +67 -0
  25. package/lib/search.js +13 -1
  26. package/lib/template-engine/asset-transformer.js +41 -0
  27. package/lib/template-engine/collections-single-transformer.js +28 -5
  28. package/lib/template-engine/collections-transformer.js +66 -32
  29. package/lib/template-engine/date-transformer.js +53 -0
  30. package/lib/template-engine/entities-transformer.js +5 -2
  31. package/lib/template-engine/partials-transformer.js +8 -5
  32. package/lib/template-engine/system-variables-provider.js +108 -0
  33. package/lib/template-engine/translate-transformer.js +98 -0
  34. package/lib/template-engine/translation-service.js +104 -0
  35. package/lib/template-engine/url-transformer.js +41 -0
  36. package/lib/template-engine.js +99 -12
  37. package/lib/template-reloader.js +307 -0
  38. package/package.json +4 -4
  39. package/templates/{browserconfig.xml → assets/favicons/default/browserconfig.xml} +1 -1
  40. package/templates/assets/favicons/default/favicon.ico +0 -0
  41. package/templates/{site.webmanifest → assets/favicons/default/site.webmanifest} +3 -3
  42. package/templates/js/functions.js +144 -0
  43. package/templates/js/scripts.js +5 -0
  44. package/templates/page.html +11 -5
  45. package/templates/partials/pagedCollection.html +1 -1
  46. package/lib/admin-translations.js +0 -56
  47. package/templates/favicon.ico +0 -0
  48. /package/templates/assets/favicons/{android-icon-144x144.png → default/android-icon-144x144.png} +0 -0
  49. /package/templates/assets/favicons/{android-icon-192x192.png → default/android-icon-192x192.png} +0 -0
  50. /package/templates/assets/favicons/{android-icon-512x512.png → default/android-icon-512x512.png} +0 -0
  51. /package/templates/assets/favicons/{apple-touch-icon.png → default/apple-touch-icon.png} +0 -0
  52. /package/templates/assets/favicons/{favicon-16x16.png → default/favicon-16x16.png} +0 -0
  53. /package/templates/assets/favicons/{favicon-32x32.png → default/favicon-32x32.png} +0 -0
  54. /package/templates/assets/favicons/{mstile-150x150.png → default/mstile-150x150.png} +0 -0
  55. /package/templates/assets/favicons/{safari-pinned-tab.svg → default/safari-pinned-tab.svg} +0 -0
@@ -27,13 +27,13 @@
27
27
  padding: 0;
28
28
  font-size: 12px;
29
29
 
30
- & .wrapper {
30
+ .wrapper {
31
31
  display: flex;
32
32
  flex-direction: column;
33
33
  min-height: 100vh;
34
34
  }
35
35
 
36
- & .notification {
36
+ .notification {
37
37
  display: none;
38
38
  position: absolute;
39
39
  top: 1.5rem;
@@ -56,7 +56,7 @@
56
56
  color: var(--white);
57
57
  }
58
58
 
59
- & .close {
59
+ .close {
60
60
  position: absolute;
61
61
  top: 1rem;
62
62
  right: 1rem;
@@ -65,26 +65,29 @@
65
65
  }
66
66
  }
67
67
 
68
- & .header {
69
- background-color: var(--darkGrey);
68
+ .header {
69
+ /* height: 3.85rem; */
70
70
  padding: 1.5rem;
71
+ background-color: var(--darkGrey);
71
72
  text-align: center;
72
73
 
73
- & .title a {
74
+ .title a {
74
75
  color: var(--white);
75
76
  text-decoration: none;
76
- font-size: 24px;
77
+ font-size: 1.5rem;
77
78
  font-weight: var(--bold);
78
79
  font-family: var(--reldensFont);
79
80
  }
80
81
  }
81
82
 
82
- & .content {
83
+ .content {
83
84
  display: flex;
85
+ flex-grow: 1;
84
86
  position: relative;
87
+ /* min-height: calc(100vh - 11.80rem); */
85
88
  }
86
89
 
87
- & .button {
90
+ .button {
88
91
  padding: 0.5rem 1rem;
89
92
  border: none;
90
93
  border-radius: 4px;
@@ -97,7 +100,7 @@
97
100
  }
98
101
  }
99
102
 
100
- & .button-primary {
103
+ .button-primary {
101
104
  color: var(--white);
102
105
  background-color: var(--lightBlue);
103
106
 
@@ -106,7 +109,7 @@
106
109
  }
107
110
  }
108
111
 
109
- & .button-secondary {
112
+ .button-secondary {
110
113
  color: var(--white);
111
114
  background-color: var(--grey);
112
115
 
@@ -115,7 +118,7 @@
115
118
  }
116
119
  }
117
120
 
118
- & .button-warning {
121
+ .button-warning {
119
122
  color: var(--white);
120
123
  background-color: var(--orange);
121
124
 
@@ -124,7 +127,7 @@
124
127
  }
125
128
  }
126
129
 
127
- & .button-danger {
130
+ .button-danger {
128
131
  color: var(--white);
129
132
  background-color: var(--red);
130
133
 
@@ -133,17 +136,17 @@
133
136
  }
134
137
  }
135
138
 
136
- & .icon {
139
+ .icon {
137
140
  &-sm {
138
141
  width: 32px;
139
142
  }
140
143
  }
141
144
 
142
- & .clickable {
145
+ .clickable {
143
146
  cursor: pointer;
144
147
  }
145
148
 
146
- & .modal-overlay {
149
+ .modal-overlay {
147
150
  display: flex;
148
151
  align-items: center;
149
152
  justify-content: center;
@@ -156,7 +159,7 @@
156
159
  background-color: rgba(0, 0, 0, 0.5);
157
160
  }
158
161
 
159
- & .modal {
162
+ .modal {
160
163
  max-width: 92vw;
161
164
  max-height: 92vh;
162
165
  padding: 1rem;
@@ -170,12 +173,12 @@
170
173
  }
171
174
  }
172
175
 
173
- & .response-error {
176
+ .response-error {
174
177
  color: var(--red);
175
178
  font-weight: var(--bold);
176
179
  }
177
180
 
178
- & .side-bar {
181
+ .side-bar {
179
182
  min-width: 230px;
180
183
  padding: 1.4rem;
181
184
  background-color: var(--darkBlue);
@@ -183,9 +186,9 @@
183
186
  box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1);
184
187
  }
185
188
 
186
- & .with-sub-items {
189
+ .with-sub-items {
187
190
  &.active {
188
- & .side-bar-item {
191
+ .side-bar-item {
189
192
  display: block;
190
193
 
191
194
  &:first-of-type {
@@ -200,7 +203,7 @@
200
203
  }
201
204
  }
202
205
 
203
- & .side-bar-item {
206
+ .side-bar-item {
204
207
  display: none;
205
208
 
206
209
  & a {
@@ -222,7 +225,7 @@
222
225
  }
223
226
  }
224
227
 
225
- & .side-bar-item {
228
+ .side-bar-item {
226
229
  margin-bottom: 0.2rem;
227
230
 
228
231
  &:first-child {
@@ -249,11 +252,11 @@
249
252
  }
250
253
  }
251
254
 
252
- & .user-area {
255
+ .user-area {
253
256
  margin-top: 1.5rem;
254
257
  }
255
258
 
256
- & .main-content {
259
+ .main-content {
257
260
  padding: 2rem;
258
261
  background-color: var(--white);
259
262
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
@@ -263,30 +266,30 @@
263
266
  width: 100%;
264
267
  }
265
268
 
266
- & .entity-list {
269
+ .entity-list {
267
270
  overflow: auto;
268
271
 
269
- & .actions {
272
+ .actions {
270
273
  display: flex;
271
274
  justify-content: end;
272
275
  margin-bottom: 1rem;
273
276
  }
274
277
  }
275
278
 
276
- & .forms-container {
279
+ .forms-container {
277
280
  width: 96%;
278
281
  max-width: 400px;
279
282
  margin: auto;
280
283
  }
281
284
 
282
- & .form-title {
285
+ .form-title {
283
286
  font-size: 22px;
284
287
  margin-bottom: 2%;
285
288
  color: var(--darkGrey);
286
289
  text-align: center;
287
290
  }
288
291
 
289
- & .input-box {
292
+ .input-box {
290
293
  margin: 0 auto 4%;
291
294
 
292
295
  & label {
@@ -320,7 +323,7 @@
320
323
  min-height: 300px;
321
324
  }
322
325
 
323
- & .table-container {
326
+ .table-container {
324
327
  width: 96%;
325
328
  margin: auto;
326
329
  }
@@ -332,14 +335,14 @@
332
335
  text-align: center;
333
336
  }
334
337
 
335
- & .list {
338
+ .list {
336
339
  width: 100%;
337
340
  border-collapse: collapse;
338
341
  margin-bottom: 2%;
339
342
  color: var(--darkGrey);
340
343
  table-layout: auto;
341
344
 
342
- & .row {
345
+ .row {
343
346
  background-color: var(--white);
344
347
 
345
348
  &.row-header {
@@ -360,7 +363,7 @@
360
363
  }
361
364
  }
362
365
 
363
- & .field {
366
+ .field {
364
367
  padding: 0.5rem 0;
365
368
  min-width: min-content;
366
369
  white-space: nowrap;
@@ -368,23 +371,23 @@
368
371
  border: 1px solid #ccc;
369
372
  text-align: left;
370
373
 
371
- & .button-list-delete {
374
+ .button-list-delete {
372
375
  border: none;
373
376
  background-color: transparent;
374
377
  cursor: pointer;
375
378
  }
376
379
 
377
- & .field-actions-container {
380
+ .field-actions-container {
378
381
  display: flex;
379
382
  flex-direction: column;
380
383
  justify-content: center;
381
384
  align-items: center;
382
385
  margin: 0 1rem;
383
386
 
384
- & .button {
387
+ .button {
385
388
  margin-bottom: 1rem;
386
389
 
387
- &.list-delete-selection {
390
+ &.list-select {
388
391
  margin-bottom: 0;
389
392
  }
390
393
  }
@@ -405,7 +408,7 @@
405
408
  }
406
409
  }
407
410
 
408
- & .field-edit, & .field-delete {
411
+ .field-edit, .field-delete {
409
412
  & span {
410
413
  display: block;
411
414
  text-align: center;
@@ -413,7 +416,7 @@
413
416
  }
414
417
  }
415
418
 
416
- & .field-edit {
419
+ .field-edit {
417
420
  & span {
418
421
  & svg, path {
419
422
  width: 24px;
@@ -422,7 +425,7 @@
422
425
  }
423
426
  }
424
427
 
425
- & .field-delete {
428
+ .field-delete {
426
429
  & span {
427
430
  & svg, path {
428
431
  width: 24px;
@@ -432,11 +435,11 @@
432
435
  }
433
436
  }
434
437
 
435
- & .filters-toggle {
438
+ .filters-toggle {
436
439
  cursor: pointer;
437
440
  }
438
441
 
439
- & .filters-toggle-content {
442
+ .filters-toggle-content {
440
443
  display: flex;
441
444
  flex-wrap: wrap;
442
445
  justify-content: flex-start;
@@ -447,7 +450,7 @@
447
450
  }
448
451
  }
449
452
 
450
- & .pagination {
453
+ .pagination {
451
454
  width: 100%;
452
455
  display: flex;
453
456
  flex-flow: wrap;
@@ -469,9 +472,9 @@
469
472
  }
470
473
  }
471
474
 
472
- & .footer {
475
+ .footer {
476
+ padding: 2rem;
473
477
  text-align: center;
474
- padding: 2%;
475
478
  background-color: var(--darkGrey);
476
479
  color: var(--white);
477
480
 
@@ -485,7 +488,7 @@
485
488
  }
486
489
  }
487
490
 
488
- & .copyright {
491
+ .copyright {
489
492
  position: relative;
490
493
  display: block;
491
494
  width: 100%;
@@ -502,23 +505,23 @@
502
505
 
503
506
  }
504
507
 
505
- & .alert {
508
+ .alert {
506
509
  font-weight: var(--bold);
507
510
  color: var(--red);
508
511
  }
509
512
 
510
- & .shutting-down {
513
+ .shutting-down {
511
514
  margin-bottom: 1rem;
512
515
  }
513
516
 
514
- & .sub-content {
517
+ .sub-content {
515
518
  background-color: var(--lightGrey2);
516
519
  padding: 1rem;
517
520
  margin-bottom: 1rem;
518
521
  border: 1px solid #ccc;
519
522
  border-radius: 4px;
520
523
 
521
- & .sub-content-form {
524
+ .sub-content-form {
522
525
  display: flex;
523
526
  flex-wrap: wrap;
524
527
  align-items: flex-end;
@@ -529,8 +532,7 @@
529
532
  flex-direction: row;
530
533
  vertical-align: middle;
531
534
  align-items: center;
532
- width: 100%;
533
- margin: 0 0 1rem 0;
535
+ margin: 0 1rem 1rem 0;
534
536
  font-size: 14px;
535
537
  color: var(--darkGrey);
536
538
 
@@ -544,13 +546,13 @@
544
546
  }
545
547
  }
546
548
 
547
- & .actions {
549
+ .actions {
548
550
  display: flex;
549
551
  width: 100%;
550
552
  margin: 1rem 0 0 0;
551
553
  }
552
554
 
553
- & .sub-content-box {
555
+ .sub-content-box {
554
556
  display: flex;
555
557
  flex-direction: column;
556
558
  margin-bottom: 1rem;
@@ -584,18 +586,71 @@
584
586
  }
585
587
  }
586
588
 
587
- & .maps-wizard {
588
- & .main-action-container.maps-selection {
589
+ .filters-header {
590
+ display: flex;
591
+ justify-content: space-between;
592
+ align-items: center;
593
+ width: 100%;
594
+ margin-bottom: 1rem;
595
+ flex-wrap: wrap;
596
+ gap: 1rem;
597
+ }
598
+
599
+ .filters-toggle {
600
+ cursor: pointer;
601
+ margin: 0;
602
+ padding: 0.5rem 0;
603
+ flex-shrink: 0;
604
+ }
605
+
606
+ .filters-toggle img {
607
+ width: 34px;
608
+ height: auto;
609
+ margin-right: 0.5rem;
610
+ }
611
+
612
+ .search-controls {
613
+ display: flex;
614
+ align-items: center;
615
+ gap: 0.5rem;
616
+ flex-wrap: wrap;
617
+ flex: 1;
618
+ justify-content: flex-end;
619
+ }
620
+
621
+ .search-input-group input[type="text"] {
622
+ width: calc(100% - 1rem);
623
+ padding: 0.5rem;
624
+ border: 1px solid #ccc;
625
+ border-radius: 4px;
626
+ font-size: 1rem;
627
+ }
628
+
629
+ .search-input-group input[type="text"]:focus {
630
+ outline: none;
631
+ border-color: var(--lightBlue);
632
+ box-shadow: 0 0 0 0.2rem rgba(52, 152, 219, 0.25);
633
+ }
634
+
635
+ .filter-actions {
636
+ display: flex;
637
+ gap: 0.5rem;
638
+ flex-wrap: wrap;
639
+ flex-shrink: 0;
640
+ }
641
+
642
+ .maps-wizard {
643
+ .main-action-container.maps-selection {
589
644
  width: 100%;
590
645
 
591
- & .wizard-options-container {
646
+ .wizard-options-container {
592
647
  display: flex;
593
648
  justify-content: space-between;
594
649
  flex-wrap: wrap;
595
650
  width: 100%;
596
651
 
597
652
  /* 3 or more items => 4 columns */
598
- & .wizard-map-option-container {
653
+ .wizard-map-option-container {
599
654
  flex: 0 0 22%;
600
655
  padding: 1rem 1% 0;
601
656
  margin: 1.5rem 0 0;
@@ -603,7 +658,7 @@
603
658
  }
604
659
 
605
660
  /* 1 child => 1 columns */
606
- & .wizard-map-option-container:only-child {
661
+ .wizard-map-option-container:only-child {
607
662
  flex: 0 0 100%;
608
663
  padding: 1rem 0 0;
609
664
  border: none;
@@ -611,7 +666,7 @@
611
666
 
612
667
  /* 2 children => 2 columns */
613
668
  .wizard-map-option-container:first-child:nth-last-child(2),
614
- & .wizard-map-option-container:last-child:nth-child(2) {
669
+ .wizard-map-option-container:last-child:nth-child(2) {
615
670
  flex: 0 0 47%;
616
671
  }
617
672
 
@@ -622,13 +677,13 @@
622
677
  }
623
678
  }
624
679
 
625
- & .checkbox-container {
680
+ .checkbox-container {
626
681
  display: flex;
627
682
  flex-direction: row;
628
683
  font-weight: var(--bold);
629
684
  }
630
685
 
631
- & .wizard-options-container {
686
+ .wizard-options-container {
632
687
  padding: 0;
633
688
  margin-bottom: 1rem;
634
689
 
@@ -638,7 +693,7 @@
638
693
  margin-right: 6px;
639
694
  }
640
695
 
641
- & .wizard-map-option-container {
696
+ .wizard-map-option-container {
642
697
  display: flex;
643
698
  flex-direction: column;
644
699
  list-style: none;
@@ -656,39 +711,39 @@
656
711
  }
657
712
  }
658
713
 
659
- & .wizard-option-container {
714
+ .wizard-option-container {
660
715
  list-style: none;
661
716
  margin-bottom: 1rem;
662
717
 
663
- & .main-option {
718
+ .main-option {
664
719
  display: inline-block;
665
720
  cursor: pointer;
666
721
  }
667
722
 
668
- & .maps-wizard-option-content {
723
+ .maps-wizard-option-content {
669
724
  display: none;
670
725
  padding-left: 1.6rem;
671
726
  }
672
727
 
673
728
  &.active {
674
- & .maps-wizard-option-content {
729
+ .maps-wizard-option-content {
675
730
  display: block;
676
731
  }
677
732
  }
678
733
  }
679
734
  }
680
735
 
681
- & .maps-wizard-form {
736
+ .maps-wizard-form {
682
737
  align-items: flex-start;
683
738
  flex-direction: column;
684
739
  justify-content: flex-start;
685
740
 
686
- & .submit-container {
741
+ .submit-container {
687
742
  display: flex;
688
743
  }
689
744
  }
690
745
 
691
- & .sub-map-option-description {
746
+ .sub-map-option-description {
692
747
  display: flex;
693
748
  align-items: center;
694
749
 
@@ -697,7 +752,7 @@
697
752
  }
698
753
  }
699
754
 
700
- & .sub-maps-container {
755
+ .sub-maps-container {
701
756
  display: block;
702
757
 
703
758
  &.hidden {
@@ -710,7 +765,7 @@
710
765
  }
711
766
  }
712
767
 
713
- & .loading {
768
+ .loading {
714
769
  max-width: 50px;
715
770
 
716
771
  &.hidden {
@@ -718,7 +773,7 @@
718
773
  }
719
774
  }
720
775
 
721
- & .entity-view, .entity-edit {
776
+ .entity-view, .entity-edit {
722
777
  & h2 {
723
778
  font-size: 22px;
724
779
  margin-bottom: 2rem;
@@ -726,7 +781,7 @@
726
781
  text-align: center;
727
782
  }
728
783
 
729
- & .view-field, .edit-field {
784
+ .view-field, .edit-field {
730
785
  display: flex;
731
786
  justify-content: space-between;
732
787
  padding: 0;
@@ -765,11 +820,11 @@
765
820
  }
766
821
  }
767
822
 
768
- & .view-field .field-value img {
823
+ .view-field .field-value img {
769
824
  max-width: 200px;
770
825
  }
771
826
 
772
- & .edit-field {
827
+ .edit-field {
773
828
  & span, input {
774
829
  &.field-value {
775
830
  display: flex;
@@ -784,12 +839,12 @@
784
839
  margin: 0;
785
840
  padding: 0.5rem;
786
841
  border: none;
787
- background: transparent;
842
+ background-color: transparent;
788
843
 
789
844
  &:not([disabled]) {
790
845
  margin: 0;
791
846
  border: 1px solid #7f8c8d;
792
- background: var(--white);
847
+ background-color: var(--white);
793
848
 
794
849
  &[type="checkbox"] {
795
850
  max-width: max-content;
@@ -802,15 +857,15 @@
802
857
  }
803
858
  }
804
859
 
805
- & .actions {
806
- margin-top: 2rem;
860
+ .actions {
861
+ margin: 2rem 0;
807
862
  text-align: center;
808
863
 
809
864
  & form {
810
865
  display: inline;
811
866
  }
812
867
 
813
- & .button {
868
+ .button {
814
869
  display: inline-block;
815
870
  margin: 0 0.5rem;
816
871
  }
@@ -829,7 +884,7 @@
829
884
  text-align: center;
830
885
  }
831
886
 
832
- & .extra-content-container, .default-room-container {
887
+ .extra-content-container, .default-room-container {
833
888
  display: flex;
834
889
  flex-direction: column;
835
890
  padding: 1rem 0;
@@ -841,14 +896,14 @@
841
896
  }
842
897
  }
843
898
 
844
- & .association-maps-container {
899
+ .association-maps-container {
845
900
  display: block;
846
901
  width: 100%;
847
902
  max-height: 500px;
848
903
  overflow: auto;
849
904
  }
850
905
 
851
- .cache-confirm-dialog {
906
+ .confirm-dialog {
852
907
  border: none;
853
908
  border-radius: 8px;
854
909
  padding: 0;
@@ -857,38 +912,40 @@
857
912
  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
858
913
  }
859
914
 
860
- .cache-confirm-dialog::backdrop {
915
+ .confirm-dialog::backdrop {
861
916
  background-color: rgba(0, 0, 0, 0.5);
862
917
  }
863
918
 
864
- .cache-dialog-content {
919
+ .dialog-content {
865
920
  padding: 1rem;
866
921
  }
867
922
 
868
- .cache-dialog-content h5 {
923
+ .dialog-content h5 {
869
924
  margin: 0 0 1rem 0;
870
925
  font-size: 18px;
871
926
  color: var(--darkGrey);
872
927
  }
873
928
 
874
- .cache-dialog-content p {
929
+ .dialog-content p {
875
930
  margin: 0 0 1rem 0;
876
931
  color: var(--darkGrey);
877
932
  }
878
933
 
879
- .cache-warning {
880
- padding: 1rem;
881
- background-color: #fff3cd;
882
- border: 1px solid #ffeaa7;
883
- border-radius: 4px;
884
- color: #856404;
885
- margin-bottom: 1rem;
886
- }
887
-
888
- .cache-dialog-actions {
934
+ .dialog-actions {
889
935
  display: flex;
890
936
  justify-content: flex-end;
891
937
  gap: 1rem;
892
938
  }
893
939
 
894
940
  }
941
+
942
+ @media (max-width: 768px) {
943
+ .reldens-admin-panel .filter-actions {
944
+ flex-direction: column;
945
+ }
946
+
947
+ .reldens-admin-panel .filter-actions .button {
948
+ width: 100%;
949
+ text-align: center;
950
+ }
951
+ }