iatelier 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/iatelier.gemspec +1 -0
- data/lib/iatelier/assets/stylesheets/iatelier.css +510 -0
- data/lib/iatelier/controllers/books/_db_connector.rb +5 -3
- data/lib/iatelier/controllers/books/create.rb +38 -3
- data/lib/iatelier/controllers/books/edit.rb +6 -2
- data/lib/iatelier/controllers/books/manage.rb +10 -3
- data/lib/iatelier/controllers/books/new.rb +6 -3
- data/lib/iatelier/controllers/books/update.rb +27 -4
- data/lib/iatelier/models/book.rb +44 -71
- data/lib/iatelier/templates/books/_engine.html.haml +11 -2
- data/lib/iatelier/templates/books/edit.html.haml +0 -1
- data/lib/iatelier/templates/books/grouping/_keywords.html.haml +1 -1
- data/lib/iatelier/templates/books/manage.html.haml +3 -1
- data/lib/iatelier/templates/books/new.html.haml +1 -3
- data/lib/iatelier/version.rb +1 -1
- data/lib/iatelier/views/books/create.rb +1 -0
- data/lib/iatelier/views/books/manage.rb +3 -0
- data/lib/iatelier/views/books/update.rb +1 -0
- data/package.json +1 -1
- data/src/sass/iatelier.scss +1 -1
- metadata +16 -3
- data/lib/iatelier/templates/books/update.html.haml +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7197869b7483e6d3418708d5a73eb219b45ed27803263ade922666e3e15c48e0
|
|
4
|
+
data.tar.gz: ab05fd67450e3f3e939fc957a5a75ddafe2c0fc612eac2f91ca20a760f0d5264
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7e6cc9a102be00f0299c158e55fd21ed2b2d385b4f0e7e2e25c0db90a6921809eda967b6a3c0a5a0fc39a69c3782932631dcf6f69b141b58d36d35985912d57c
|
|
7
|
+
data.tar.gz: 27f857f759065a3d1d17805c3a704c9b7b36adf59b92141d1605d6e77a2ebcfd468adf113fd67c4756881b89a9154276b15af062a7086fcdbc16345559b3763d
|
data/iatelier.gemspec
CHANGED
|
@@ -521,6 +521,516 @@ a:hover {
|
|
|
521
521
|
background-color: rgba(255, 255, 255, 0.2);
|
|
522
522
|
}
|
|
523
523
|
|
|
524
|
+
.selectable-text {
|
|
525
|
+
cursor: text;
|
|
526
|
+
-webkit-user-select: text;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
.text-center {
|
|
530
|
+
text-align: center;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
.text-right {
|
|
534
|
+
text-align: right;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
.text-left {
|
|
538
|
+
text-align: left;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
.pull-left {
|
|
542
|
+
float: left;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
.pull-right {
|
|
546
|
+
float: right;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
.padded {
|
|
550
|
+
padding: 10px;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
.padded-less {
|
|
554
|
+
padding: 5px;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
.padded-more {
|
|
558
|
+
padding: 20px;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
.padded-vertically {
|
|
562
|
+
padding-top: 10px;
|
|
563
|
+
padding-bottom: 10px;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
.padded-vertically-less {
|
|
567
|
+
padding-top: 5px;
|
|
568
|
+
padding-bottom: 5px;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
.padded-vertically-more {
|
|
572
|
+
padding-top: 20px;
|
|
573
|
+
padding-bottom: 20px;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
.padded-horizontally {
|
|
577
|
+
padding-right: 10px;
|
|
578
|
+
padding-left: 10px;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
.padded-horizontally-less {
|
|
582
|
+
padding-right: 5px;
|
|
583
|
+
padding-left: 5px;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
.padded-horizontally-more {
|
|
587
|
+
padding-right: 20px;
|
|
588
|
+
padding-left: 20px;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
.padded-top {
|
|
592
|
+
padding-top: 10px;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
.padded-top-less {
|
|
596
|
+
padding-top: 5px;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
.padded-top-more {
|
|
600
|
+
padding-top: 20px;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
.padded-bottom {
|
|
604
|
+
padding-bottom: 10px;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
.padded-bottom-less {
|
|
608
|
+
padding-bottom: 5px;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
.padded-bottom-more {
|
|
612
|
+
padding-bottom: 20px;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
.sidebar {
|
|
616
|
+
background-color: #f5f5f4;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.draggable {
|
|
620
|
+
-webkit-app-region: drag;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
.clearfix:before,
|
|
624
|
+
.clearfix:after {
|
|
625
|
+
display: table;
|
|
626
|
+
content: " ";
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
.clearfix:after {
|
|
630
|
+
clear: both;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
* {
|
|
634
|
+
cursor: default;
|
|
635
|
+
box-sizing: border-box;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
html {
|
|
639
|
+
height: 100%;
|
|
640
|
+
width: 100%;
|
|
641
|
+
overflow: hidden;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
body {
|
|
645
|
+
height: 100%;
|
|
646
|
+
padding: 0;
|
|
647
|
+
margin: 0;
|
|
648
|
+
font-family: system, -apple-system, ".SFNSDisplay-Regular", "Helvetica Neue", Helvetica, "Segoe UI", sans-serif;
|
|
649
|
+
font-size: 13px;
|
|
650
|
+
line-height: 1.6;
|
|
651
|
+
color: #333;
|
|
652
|
+
background-color: transparent;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
hr {
|
|
656
|
+
margin: 15px 0;
|
|
657
|
+
overflow: hidden;
|
|
658
|
+
background: transparent;
|
|
659
|
+
border: 0;
|
|
660
|
+
border-bottom: 1px solid #ddd;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
h1,
|
|
664
|
+
h2,
|
|
665
|
+
h3,
|
|
666
|
+
h4,
|
|
667
|
+
h5,
|
|
668
|
+
h6 {
|
|
669
|
+
margin-top: 20px;
|
|
670
|
+
margin-bottom: 10px;
|
|
671
|
+
font-weight: 500;
|
|
672
|
+
white-space: nowrap;
|
|
673
|
+
overflow: hidden;
|
|
674
|
+
text-overflow: ellipsis;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
h1 {
|
|
678
|
+
font-size: 36px;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
h2 {
|
|
682
|
+
font-size: 30px;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
h3 {
|
|
686
|
+
font-size: 24px;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
h4 {
|
|
690
|
+
font-size: 18px;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
h5 {
|
|
694
|
+
font-size: 14px;
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
h6 {
|
|
698
|
+
font-size: 12px;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
/*
|
|
702
|
+
.window {
|
|
703
|
+
position: absolute;
|
|
704
|
+
top: 0;
|
|
705
|
+
right: 0;
|
|
706
|
+
bottom: 0;
|
|
707
|
+
left: 0;
|
|
708
|
+
display: flex;
|
|
709
|
+
flex-direction: column;
|
|
710
|
+
background-color: $chrome-color;
|
|
711
|
+
}
|
|
712
|
+
*/
|
|
713
|
+
|
|
714
|
+
.window-content {
|
|
715
|
+
position: relative;
|
|
716
|
+
overflow-y: auto;
|
|
717
|
+
display: -webkit-box;
|
|
718
|
+
display: flex;
|
|
719
|
+
-webkit-box-flex: 1;
|
|
720
|
+
flex: 1;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
.toolbar {
|
|
724
|
+
min-height: 22px;
|
|
725
|
+
box-shadow: inset 0 1px 0 #f5f4f5;
|
|
726
|
+
background-color: #e8e6e8;
|
|
727
|
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e6e8), to(#d1cfd1));
|
|
728
|
+
background-image: linear-gradient(to bottom, #e8e6e8 0%, #d1cfd1 100%);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
.toolbar:before,
|
|
732
|
+
.toolbar:after {
|
|
733
|
+
display: table;
|
|
734
|
+
content: " ";
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
.toolbar:after {
|
|
738
|
+
clear: both;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
.toolbar-header {
|
|
742
|
+
border-bottom: 1px solid #b3b2b3;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
.toolbar-header .title {
|
|
746
|
+
margin-top: 1px;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
.toolbar-footer {
|
|
750
|
+
border-top: 1px solid #b3b2b3;
|
|
751
|
+
-webkit-app-region: drag;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
.title {
|
|
755
|
+
margin: 0;
|
|
756
|
+
font-size: 12px;
|
|
757
|
+
font-weight: 400;
|
|
758
|
+
text-align: center;
|
|
759
|
+
color: #555;
|
|
760
|
+
cursor: default;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
.toolbar-borderless {
|
|
764
|
+
border-top: 0;
|
|
765
|
+
border-bottom: 0;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
.toolbar-actions {
|
|
769
|
+
margin-top: 4px;
|
|
770
|
+
margin-bottom: 3px;
|
|
771
|
+
padding-right: 3px;
|
|
772
|
+
padding-left: 3px;
|
|
773
|
+
padding-bottom: 3px;
|
|
774
|
+
-webkit-app-region: drag;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
.toolbar-actions:before,
|
|
778
|
+
.toolbar-actions:after {
|
|
779
|
+
display: table;
|
|
780
|
+
content: " ";
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
.toolbar-actions:after {
|
|
784
|
+
clear: both;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
.toolbar-actions > .btn,
|
|
788
|
+
.toolbar-actions > .btn-group {
|
|
789
|
+
margin-left: 4px;
|
|
790
|
+
margin-right: 4px;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
.menu-bar {
|
|
794
|
+
margin: 0px;
|
|
795
|
+
padding: 0px;
|
|
796
|
+
font-size: 12px;
|
|
797
|
+
background-color: #d3d3d3;
|
|
798
|
+
border-bottom: 1px solid black;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
.menu-bar a {
|
|
802
|
+
display: inline-block;
|
|
803
|
+
margin: 0px 0px;
|
|
804
|
+
padding: 1px 8px;
|
|
805
|
+
border: none;
|
|
806
|
+
background-color: transparent;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
.menu-bar a:hover {
|
|
810
|
+
color: white;
|
|
811
|
+
background-color: #345EF2;
|
|
812
|
+
border: none;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
.window .bar {
|
|
816
|
+
box-shadow: inset 0 1px 0 #f5f4f5;
|
|
817
|
+
background-color: #e8e6e8;
|
|
818
|
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e6e8), to(#d1cfd1));
|
|
819
|
+
background-image: linear-gradient(to bottom, #e8e6e8 0%, #d1cfd1 100%);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
.window .bar > .menu {
|
|
823
|
+
height: 22px;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
.window .bar > .buttons {
|
|
827
|
+
height: 44px;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
.window .bar > .tabs {
|
|
831
|
+
border-top: 1px solid gray;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
.window .bar > .tabs > a {
|
|
835
|
+
display: inline-block;
|
|
836
|
+
font-size: 12px;
|
|
837
|
+
margin: 4px 1px;
|
|
838
|
+
padding: 0px 8px;
|
|
839
|
+
border-radius: 4px;
|
|
840
|
+
border: none;
|
|
841
|
+
background-color: transparent;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
.window .bar > .tabs > a:hover {
|
|
845
|
+
background-color: rgba(0, 0, 0, 0.2);
|
|
846
|
+
color: white;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
.window .bar > .tabs > a:active {
|
|
850
|
+
background-color: rgba(0, 0, 0, 0.4);
|
|
851
|
+
color: white;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
#os {
|
|
855
|
+
display: -ms-grid;
|
|
856
|
+
display: grid;
|
|
857
|
+
-ms-grid-rows: 20px auto;
|
|
858
|
+
grid-template-rows: 20px auto;
|
|
859
|
+
height: 100vh;
|
|
860
|
+
width: 100vw;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
#os .menu-bar {
|
|
864
|
+
margin: 0px;
|
|
865
|
+
padding: 0px;
|
|
866
|
+
font-size: 12px;
|
|
867
|
+
background-color: #d3d3d3;
|
|
868
|
+
border-bottom: 1px solid black;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
#os .menu-bar a {
|
|
872
|
+
display: inline-block;
|
|
873
|
+
margin: 0px 0px;
|
|
874
|
+
padding: 1px 8px;
|
|
875
|
+
border: none;
|
|
876
|
+
background-color: transparent;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
#os .menu-bar a:hover {
|
|
880
|
+
color: white;
|
|
881
|
+
background-color: #345EF2;
|
|
882
|
+
border: none;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
#os .desk {
|
|
886
|
+
min-height: 0;
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
.window {
|
|
890
|
+
height: 100%;
|
|
891
|
+
max-height: 100%;
|
|
892
|
+
max-width: 100%;
|
|
893
|
+
display: -ms-grid;
|
|
894
|
+
display: grid;
|
|
895
|
+
-ms-grid-rows: min-content 1fr min-content;
|
|
896
|
+
grid-template-rows: -webkit-min-content 1fr -webkit-min-content;
|
|
897
|
+
grid-template-rows: min-content 1fr min-content;
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
.window .bar {
|
|
901
|
+
box-shadow: inset 0 1px 0 #f5f4f5;
|
|
902
|
+
background-color: #e8e6e8;
|
|
903
|
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e6e8), to(#d1cfd1));
|
|
904
|
+
background-image: linear-gradient(to bottom, #e8e6e8 0%, #d1cfd1 100%);
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
.window .bar > .menu {
|
|
908
|
+
height: 22px;
|
|
909
|
+
text-align: center;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
.window .bar > .buttons {
|
|
913
|
+
height: 44px;
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
.window .bar > .tabs {
|
|
917
|
+
border-top: 1px solid gray;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
.window .bar > .tabs > a {
|
|
921
|
+
display: inline-block;
|
|
922
|
+
font-size: 12px;
|
|
923
|
+
margin: 4px 1px;
|
|
924
|
+
padding: 0px 8px;
|
|
925
|
+
border-radius: 4px;
|
|
926
|
+
border: none;
|
|
927
|
+
background-color: transparent;
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
.window .bar > .tabs > a:hover {
|
|
931
|
+
background-color: rgba(0, 0, 0, 0.2);
|
|
932
|
+
color: white;
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
.window .bar > .tabs > a:active {
|
|
936
|
+
background-color: rgba(0, 0, 0, 0.4);
|
|
937
|
+
color: white;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
.window .content {
|
|
941
|
+
min-height: 0;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
.window-drawer-top {
|
|
945
|
+
margin: 0.5rem auto;
|
|
946
|
+
padding: 0.4rem;
|
|
947
|
+
max-width: 40rem;
|
|
948
|
+
text-align: left;
|
|
949
|
+
background-color: #e8e6e8;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
.window > .content {
|
|
953
|
+
display: -ms-grid;
|
|
954
|
+
display: grid;
|
|
955
|
+
-ms-grid-columns: 1fr;
|
|
956
|
+
grid-template-columns: 1fr;
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
@media screen and (min-width: 35.5em) {
|
|
960
|
+
.window > .content {
|
|
961
|
+
-ms-grid-columns: 14.4rem 1fr;
|
|
962
|
+
grid-template-columns: 14.4rem 1fr;
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
.window > .content > .sidebar {
|
|
967
|
+
display: none;
|
|
968
|
+
overflow-y: scroll;
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
@media screen and (min-width: 35.5em) {
|
|
972
|
+
.window > .content > .sidebar {
|
|
973
|
+
display: block;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
.window > .content > .panel {
|
|
978
|
+
overflow: scroll;
|
|
979
|
+
min-width: 0px;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
.text-editor {
|
|
983
|
+
min-height: 80vh;
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
.panel-edit > .form-box {
|
|
987
|
+
padding: 0.8rem;
|
|
988
|
+
background-color: #cdcdcd;
|
|
989
|
+
border-radius: 0.4rem;
|
|
990
|
+
box-shadow: inset 0px 0px 1px grey;
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
.os-form-group {
|
|
994
|
+
margin: 0.4rem 0.4rem;
|
|
995
|
+
white-space: nowrap;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
.os-form-group > label {
|
|
999
|
+
display: inline-block;
|
|
1000
|
+
width: 5em;
|
|
1001
|
+
vertical-align: middle;
|
|
1002
|
+
text-align: end;
|
|
1003
|
+
white-space: normal;
|
|
1004
|
+
word-wrap: break-word;
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
.os-form-group > .form-control {
|
|
1008
|
+
display: inline-block;
|
|
1009
|
+
width: calc(100% - 5em);
|
|
1010
|
+
box-sizing: border-box;
|
|
1011
|
+
vertical-align: middle;
|
|
1012
|
+
white-space: normal;
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
/*
|
|
1016
|
+
@import '~purecss/build/pure-min.css';
|
|
1017
|
+
@import '~purecss/build/grids-responsive-min.css';
|
|
1018
|
+
@import '/pure/grids/xx';
|
|
1019
|
+
|
|
1020
|
+
// BlazeCSS
|
|
1021
|
+
// @import '~blaze';
|
|
1022
|
+
|
|
1023
|
+
// font
|
|
1024
|
+
@import '/fonts';
|
|
1025
|
+
|
|
1026
|
+
// variables & basics
|
|
1027
|
+
@import '/shadow';
|
|
1028
|
+
@import '/colors/style';
|
|
1029
|
+
|
|
1030
|
+
@import '/components/link-button';
|
|
1031
|
+
@import '/components/insection';
|
|
1032
|
+
*/
|
|
1033
|
+
|
|
524
1034
|
.text-editor {
|
|
525
1035
|
min-height: 80vh;
|
|
526
1036
|
}
|
|
@@ -4,10 +4,12 @@ module Iatelier
|
|
|
4
4
|
module DbConnector
|
|
5
5
|
def set_database database
|
|
6
6
|
tmp_config = ActiveRecord::Base.connection_config
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
if !database.nil?
|
|
8
|
+
tmp_config[:database] = database
|
|
9
|
+
ActiveRecord::Base.establish_connection tmp_config
|
|
10
|
+
end
|
|
9
11
|
end
|
|
10
12
|
end
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
|
-
end
|
|
15
|
+
end
|
|
@@ -4,11 +4,46 @@ module Iatelier
|
|
|
4
4
|
class Create
|
|
5
5
|
include Iatelier::Action
|
|
6
6
|
include Iatelier::Controllers::Books::DbConnector
|
|
7
|
+
expose :book, :book_type, :database, :errors
|
|
7
8
|
def call(params)
|
|
8
|
-
|
|
9
|
+
# [optional] setting the database
|
|
10
|
+
@database = params.get(:database)
|
|
11
|
+
self.set_database @database
|
|
12
|
+
|
|
13
|
+
#
|
|
9
14
|
@book = Object.const_get(params[:book_type].capitalize).new
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
@book.namespace = database
|
|
16
|
+
|
|
17
|
+
# p 'starting everything'
|
|
18
|
+
@book.dimensions.each do |dimension|
|
|
19
|
+
method_name = 'setup_' + dimension
|
|
20
|
+
action = @book.public_send(method_name.to_sym, params)
|
|
21
|
+
p 'what is the status = ' + action.valid?.to_s
|
|
22
|
+
if !action.valid?
|
|
23
|
+
puts 'the error is ' + action.errors.messages.to_s
|
|
24
|
+
@errors = action.errors.messages
|
|
25
|
+
self.status = 422
|
|
26
|
+
return 'caught an error!'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
@book.save
|
|
31
|
+
|
|
32
|
+
@book.dimensions.each do |dimension|
|
|
33
|
+
action = @book.public_send(dimension.to_sym)
|
|
34
|
+
if !action.save
|
|
35
|
+
@errors = action.errors.messages
|
|
36
|
+
self.status = 422
|
|
37
|
+
return 'caught an error!'
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
@book.sync_keywords params
|
|
42
|
+
@book.sync_individuals params
|
|
43
|
+
@book.sync_content params
|
|
44
|
+
@book.store_attachment params
|
|
45
|
+
|
|
46
|
+
redirect_to '/iatelier/' + @database + '/' + params[:book_type]
|
|
12
47
|
end
|
|
13
48
|
end
|
|
14
49
|
end
|
|
@@ -6,9 +6,13 @@ module Iatelier
|
|
|
6
6
|
include Iatelier::Controllers::Books::DbConnector
|
|
7
7
|
expose :book, :database
|
|
8
8
|
def call(params)
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
# [optional] setting the database
|
|
10
|
+
@database = params.get(:database)
|
|
11
|
+
self.set_database @database
|
|
12
|
+
|
|
13
|
+
#
|
|
11
14
|
@book = Object.const_get(params[:book_type].capitalize).find(params[:id])
|
|
15
|
+
@book.namespace = @database
|
|
12
16
|
end
|
|
13
17
|
end
|
|
14
18
|
end
|
|
@@ -4,10 +4,17 @@ module Iatelier
|
|
|
4
4
|
class Manage
|
|
5
5
|
include Iatelier::Action
|
|
6
6
|
include Iatelier::Controllers::Books::DbConnector
|
|
7
|
-
expose :books
|
|
7
|
+
expose :books, :uri
|
|
8
8
|
def call(params)
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
# [optional] setting the database
|
|
10
|
+
@database = params.get(:database)
|
|
11
|
+
self.set_database @database
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
@books = Object.const_get(params[:book_type].capitalize).includes(:timestamp).all.order("timestamps.publish desc")
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
@uri = '/iatelier/' + @database + '/' + params[:book_type] + '/'
|
|
11
18
|
end
|
|
12
19
|
end
|
|
13
20
|
end
|
|
@@ -6,12 +6,15 @@ module Iatelier
|
|
|
6
6
|
include Iatelier::Controllers::Books::DbConnector
|
|
7
7
|
expose :book, :book_type, :database
|
|
8
8
|
def call(params)
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
# [optional] setting the database
|
|
10
|
+
@database = params.get(:database)
|
|
11
|
+
self.set_database @database
|
|
12
|
+
|
|
11
13
|
@book_type = params[:book_type].capitalize;
|
|
12
14
|
@book = Object.const_get(@book_type).new
|
|
15
|
+
@book.namespace = @database
|
|
13
16
|
end
|
|
14
17
|
end
|
|
15
18
|
end
|
|
16
19
|
end
|
|
17
|
-
end
|
|
20
|
+
end
|
|
@@ -4,12 +4,35 @@ module Iatelier
|
|
|
4
4
|
class Update
|
|
5
5
|
include Iatelier::Action
|
|
6
6
|
include Iatelier::Controllers::Books::DbConnector
|
|
7
|
+
expose :book, :database, :errors
|
|
7
8
|
def call(params)
|
|
8
|
-
|
|
9
|
+
# [optional] setting the database
|
|
10
|
+
@database = params.get(:database)
|
|
11
|
+
self.set_database @database
|
|
12
|
+
|
|
13
|
+
# setting up the book
|
|
9
14
|
@book = Object.const_get(params[:book_type].capitalize).find(params[:id])
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
@book.namespace = @database
|
|
16
|
+
|
|
17
|
+
@book.dimensions.each do |dimension|
|
|
18
|
+
if @book.public_send(dimension.to_sym)
|
|
19
|
+
method_name = 'revise_' + dimension
|
|
20
|
+
else
|
|
21
|
+
method_name = 'setup_' + dimension
|
|
22
|
+
end
|
|
23
|
+
@book.public_send(method_name.to_sym, params)
|
|
24
|
+
end
|
|
25
|
+
@book.dimensions.each do |dimension|
|
|
26
|
+
action = @book.public_send(dimension.to_sym)
|
|
27
|
+
if !action.save
|
|
28
|
+
@errors = action.errors.messages
|
|
29
|
+
self.status = 422
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
@book.sync_keywords params
|
|
33
|
+
@book.sync_individuals params
|
|
34
|
+
@book.sync_content params
|
|
35
|
+
@book.store_attachment params
|
|
13
36
|
end
|
|
14
37
|
end
|
|
15
38
|
end
|
data/lib/iatelier/models/book.rb
CHANGED
|
@@ -5,10 +5,6 @@ class Book < ActiveRecord::Base
|
|
|
5
5
|
DIMENSIONS = []
|
|
6
6
|
GROUPINGS = []
|
|
7
7
|
ROLES = []
|
|
8
|
-
|
|
9
|
-
@content_raw = ''
|
|
10
|
-
|
|
11
|
-
@namespace = nil
|
|
12
8
|
|
|
13
9
|
has_one :title, as: :titleable, class_name: 'Dimensions::Title'
|
|
14
10
|
has_one :slug, as: :slugable, class_name: 'Dimensions::Slug'
|
|
@@ -22,23 +18,22 @@ class Book < ActiveRecord::Base
|
|
|
22
18
|
|
|
23
19
|
has_many :peopleables, as: :peopleable, dependent: :destroy
|
|
24
20
|
has_many :peoples, through: :peopleables
|
|
25
|
-
|
|
21
|
+
|
|
26
22
|
has_many :bundleables, as: :bundleable, dependent: :destroy
|
|
27
23
|
has_many :bundles, through: :bundleables
|
|
28
|
-
|
|
24
|
+
|
|
29
25
|
accepts_nested_attributes_for :title, :slug, :subtitle, :description, :thumbnail, :timestamp
|
|
30
26
|
validates_associated :slug
|
|
31
|
-
|
|
27
|
+
|
|
32
28
|
attr_accessor :namespace
|
|
33
29
|
|
|
34
|
-
|
|
35
30
|
def kind
|
|
36
31
|
self.class.to_s
|
|
37
32
|
end
|
|
38
33
|
def uniq
|
|
39
34
|
self.class.to_s + self.id.to_s
|
|
40
35
|
end
|
|
41
|
-
|
|
36
|
+
|
|
42
37
|
def dimensions
|
|
43
38
|
self.class::DIMENSIONS
|
|
44
39
|
end
|
|
@@ -53,66 +48,24 @@ class Book < ActiveRecord::Base
|
|
|
53
48
|
@query = '`peopleables`.`role` = "' + requested_role.to_s + '"'
|
|
54
49
|
self.peoples.includes(:peopleables).where(@query)
|
|
55
50
|
end
|
|
56
|
-
|
|
51
|
+
|
|
57
52
|
def content_raw
|
|
58
|
-
puts 'trying to open content'
|
|
59
53
|
unless self.id.nil?
|
|
60
|
-
puts 'id passed'
|
|
61
54
|
path = Iatelier.configuration.storage_dir + @namespace.to_s + self.class.name.downcase + '/' + self.id.to_s + '/main.md'
|
|
62
|
-
puts '
|
|
55
|
+
puts 'triving to retrive the content from the path = ' + path.to_s
|
|
63
56
|
if File.exists? path
|
|
64
|
-
|
|
65
|
-
@content = File.open(path).read
|
|
57
|
+
return File.open(path).read
|
|
66
58
|
else
|
|
67
|
-
|
|
59
|
+
return nil
|
|
68
60
|
end
|
|
69
61
|
else
|
|
70
|
-
|
|
62
|
+
return nil
|
|
71
63
|
end
|
|
72
64
|
end
|
|
73
|
-
|
|
65
|
+
|
|
74
66
|
def content
|
|
75
67
|
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true)
|
|
76
|
-
markdown.render(
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# def initialized
|
|
80
|
-
# super()
|
|
81
|
-
# puts "content of the dimension: \n"
|
|
82
|
-
# puts Dimensions.inspect
|
|
83
|
-
# Dimensions.each do |dimension|
|
|
84
|
-
# reference = dimension + able
|
|
85
|
-
# hasone dimension.to_sym as: reference.to_sym
|
|
86
|
-
# end
|
|
87
|
-
# end
|
|
88
|
-
|
|
89
|
-
def create params
|
|
90
|
-
puts 'these are the stuff were going to add:' + Dimensions.to_s
|
|
91
|
-
Dimensions.each do |dimension|
|
|
92
|
-
method_name = 'setup_' + dimension
|
|
93
|
-
self.public_send(method_name.to_sym, params)
|
|
94
|
-
end
|
|
95
|
-
self.save
|
|
96
|
-
sync_keywords params
|
|
97
|
-
sync_individuals params
|
|
98
|
-
sync_content params
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def revise params
|
|
102
|
-
Dimensions.each do |dimension|
|
|
103
|
-
if self.public_send(dimension.to_sym)
|
|
104
|
-
method_name = 'revise_' + dimension
|
|
105
|
-
else
|
|
106
|
-
method_name = 'setup_' + dimension
|
|
107
|
-
end
|
|
108
|
-
self.public_send(method_name.to_sym, params)
|
|
109
|
-
end
|
|
110
|
-
Dimensions.each do |dimension|
|
|
111
|
-
self.public_send(dimension.to_sym).save
|
|
112
|
-
end
|
|
113
|
-
sync_keywords params
|
|
114
|
-
sync_individuals params
|
|
115
|
-
sync_content params
|
|
68
|
+
return markdown.render(content_raw.to_s)
|
|
116
69
|
end
|
|
117
70
|
|
|
118
71
|
def sync_keywords params
|
|
@@ -172,31 +125,38 @@ class Book < ActiveRecord::Base
|
|
|
172
125
|
end
|
|
173
126
|
|
|
174
127
|
def setup_title params
|
|
175
|
-
self.build_title({value: params[:title]})
|
|
128
|
+
return self.build_title({value: params[:title]})
|
|
176
129
|
end
|
|
177
130
|
def revise_title params
|
|
178
|
-
self.title.update(value: params[:title])
|
|
131
|
+
return self.title.update(value: params[:title])
|
|
179
132
|
end
|
|
180
|
-
|
|
133
|
+
|
|
181
134
|
def setup_subtitle params
|
|
182
|
-
self.build_subtitle({value: params[:subtitle]})
|
|
135
|
+
return self.build_subtitle({value: params[:subtitle]})
|
|
183
136
|
end
|
|
184
137
|
def revise_subtitle params
|
|
185
|
-
self.subtitle.update(value: params[:subtitle])
|
|
138
|
+
return self.subtitle.update(value: params[:subtitle])
|
|
186
139
|
end
|
|
187
140
|
|
|
188
141
|
def setup_slug params
|
|
189
|
-
self.build_slug({value: params[:slug]})
|
|
142
|
+
return self.build_slug({value: params[:slug]})
|
|
190
143
|
end
|
|
191
144
|
def revise_slug params
|
|
192
|
-
self.slug.update(value: params[:slug])
|
|
145
|
+
return self.slug.update(value: params[:slug])
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def setup_description params
|
|
149
|
+
self.build_description({value: params[:description]})
|
|
193
150
|
end
|
|
194
|
-
|
|
151
|
+
def revise_description params
|
|
152
|
+
self.description.update(value: params[:description])
|
|
153
|
+
end
|
|
154
|
+
|
|
195
155
|
def setup_thumbnail params
|
|
196
156
|
end
|
|
197
157
|
def revise_thumbnail params
|
|
198
158
|
end
|
|
199
|
-
|
|
159
|
+
|
|
200
160
|
def setup_timestamp params
|
|
201
161
|
puts 'setting up timestamp'
|
|
202
162
|
self.build_timestamp({
|
|
@@ -219,10 +179,9 @@ class Book < ActiveRecord::Base
|
|
|
219
179
|
self.setup_timestamp params
|
|
220
180
|
end
|
|
221
181
|
end
|
|
222
|
-
|
|
182
|
+
|
|
223
183
|
def sync_content params
|
|
224
|
-
|
|
225
|
-
path = Iatelier.configuration.storage_dir + params[:database].to_s + self.class.name.downcase + '/' + self.id.to_s
|
|
184
|
+
path = Iatelier.configuration.storage_dir + @namespace.to_s + self.class.name.downcase + '/' + self.id.to_s
|
|
226
185
|
Dir.mkdir(path) unless File.exists?(path)
|
|
227
186
|
File.open(path + '/main.md', 'w+') do |file|
|
|
228
187
|
file.puts params[:content]
|
|
@@ -232,4 +191,18 @@ class Book < ActiveRecord::Base
|
|
|
232
191
|
self.save
|
|
233
192
|
puts self.loc.to_s
|
|
234
193
|
end
|
|
235
|
-
|
|
194
|
+
|
|
195
|
+
def store_attachment params
|
|
196
|
+
path = Iatelier.configuration.storage_dir + @namespace.to_s + self.class.name.downcase + '/' + self.id.to_s + '/'
|
|
197
|
+
if !params.get(:file).nil?
|
|
198
|
+
Dir.mkdir(path) unless File.exists?(path)
|
|
199
|
+
File.open(path + params[:file][:filename], 'wb') do |file|
|
|
200
|
+
file.write params[:file][:tempfile].read
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
def get_asset params
|
|
205
|
+
path = Iatelier.configuration.storage_dir + @namespace.to_s + self.class.name.downcase + '/' + self.id.to_s + '/'
|
|
206
|
+
return File.open(path + params[:asset], 'r')
|
|
207
|
+
end
|
|
208
|
+
end
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
.panel-edit
|
|
2
|
+
- if @locals.include?(:errors)
|
|
3
|
+
.form-box
|
|
4
|
+
.os-form-group
|
|
5
|
+
- errors.each do |value, key|
|
|
6
|
+
%p= value
|
|
7
|
+
%p= key
|
|
2
8
|
.form-box
|
|
3
9
|
.os-form-group
|
|
4
10
|
-if book.dimensions.include? 'title'
|
|
@@ -16,9 +22,13 @@
|
|
|
16
22
|
-if book.dimensions.include? 'description'
|
|
17
23
|
%label.label Description
|
|
18
24
|
%input{:class => "form-control pure-input-1", :name => "description", :type => "text", :placeholder => "Description", :value => book.description.try(:value)}
|
|
25
|
+
.os-form-group
|
|
26
|
+
%label.label Attachments
|
|
27
|
+
%input{:type => 'file', :id => 'file', :name => 'file'}
|
|
19
28
|
.form-box
|
|
20
29
|
%label Text
|
|
21
|
-
%
|
|
30
|
+
%br
|
|
31
|
+
%textarea{:name => "content", :class => "text-editor pure-input-1 form-control", :type => "text", :placeholder => "Content of the book ...", :style => "width: 100%"}
|
|
22
32
|
-unless book.content_raw.nil?
|
|
23
33
|
= book.content_raw
|
|
24
34
|
%div{:class => "grid-large panel-edit"}
|
|
@@ -30,4 +40,3 @@
|
|
|
30
40
|
= render :partial => 'grouping/bundles'
|
|
31
41
|
.form-box
|
|
32
42
|
= render :partial => 'dimension/timestamp'
|
|
33
|
-
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
%div
|
|
2
|
-
.todo adding errors here!
|
|
3
2
|
%form{:class => "atelier-main-form pure-form pure-form-aligned", :action => "/iatelier/#{database}/#{book.class.name.downcase}/#{book.id}", :method => "POST", :enctype => "multipart/form-data"}
|
|
4
3
|
.form-actions
|
|
5
4
|
<button type="submit" class="btn btn-default">Edit</button>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
%div{:class => "c-card__item c-card__item--divider"}
|
|
2
|
-
.span Keyword
|
|
3
2
|
%div{:class => "c-card__item"}
|
|
3
|
+
%label Keywords
|
|
4
4
|
%input{:id => "keywords", :name => "keywords", :value => book.keywords.pluck(:word).join(", ")}
|
|
5
5
|
%div{:id => "keywords-field", :name => "keywords", :type => "text", :style => "width: 100%; display: block;"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
%div
|
|
2
|
-
.todo adding errors here!
|
|
3
2
|
%form{:class => "atelier-main-form pure-form pure-form-aligned", :action => "/iatelier/#{database}/#{book.class.name.downcase}/#{book.id}", :method => "POST", :enctype => "multipart/form-data"}
|
|
4
3
|
.form-actions
|
|
5
4
|
<button type="submit" class="btn btn-default">Create</button>
|
|
6
|
-
|
|
7
|
-
= render :partial => 'engine'
|
|
5
|
+
= render :partial => 'engine'
|
data/lib/iatelier/version.rb
CHANGED
data/package.json
CHANGED
data/src/sass/iatelier.scss
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: iatelier
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Captain Husayn Pinguin
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-02-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -80,6 +80,20 @@ dependencies:
|
|
|
80
80
|
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '3.5'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: mime-types
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '3.3'
|
|
90
|
+
type: :runtime
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '3.3'
|
|
83
97
|
description: iAtelier, a simple, yet powerful CMS engine for Hanami
|
|
84
98
|
email:
|
|
85
99
|
- captainhusaynpinguin@galacticvisions.xyz
|
|
@@ -141,7 +155,6 @@ files:
|
|
|
141
155
|
- lib/iatelier/templates/books/grouping/_peoples.html.haml
|
|
142
156
|
- lib/iatelier/templates/books/manage.html.haml
|
|
143
157
|
- lib/iatelier/templates/books/new.html.haml
|
|
144
|
-
- lib/iatelier/templates/books/update.html.haml
|
|
145
158
|
- lib/iatelier/version.rb
|
|
146
159
|
- lib/iatelier/views/application_layout.rb
|
|
147
160
|
- lib/iatelier/views/books/create.rb
|
|
File without changes
|