jiapeng 8 years ago
parent
commit
f4c87426c2
16 changed files with 4029 additions and 153 deletions
  1. 2663 0
      css/common.css
  2. 74 0
      html/demo.html
  3. 8 3
      js/codehtml.js
  4. 2 2
      js/common.js
  5. 52 0
      js/datagrid.js
  6. 258 0
      js/date.js
  7. 53 43
      js/dict.js
  8. 7 6
      js/dropdown.js
  9. 13 5
      js/form.js
  10. 74 0
      js/pageDataGrid.js
  11. 64 0
      js/pager.js
  12. 222 68
      js/select.js
  13. 410 0
      js/spa.js
  14. 42 15
      js/text.js
  15. 70 0
      js/textarea.js
  16. 17 11
      js/util.js

+ 2663 - 0
css/common.css

@ -0,0 +1,2663 @@
1
@charset "UTF-8";
2
* {
3
    -webkit-box-sizing: border-box;
4
    -moz-box-sizing: border-box;
5
    box-sizing: border-box;
6
}
7
8
*::before, *::after {
9
    -webkit-box-sizing: border-box;
10
    -moz-box-sizing: border-box;
11
    box-sizing: border-box;
12
}
13
14
html, body {
15
    width: 100%;
16
    height: 100%;
17
    min-width: 960px;
18
}
19
20
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, input, button, textarea, p, blockquote, th, td, form, pre {
21
    margin: 0;
22
    padding: 0;
23
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
24
    font-family: '微软雅黑 Regular', '微软雅黑', '宋体';
25
}
26
27
a:active, a:hover {
28
    outline: 0
29
}
30
31
img {
32
    display: inline-block;
33
    border: none;
34
    vertical-align: middle;
35
}
36
37
li {
38
    list-style: none;
39
}
40
41
table {
42
    border-collapse: collapse;
43
    border-spacing: 0;
44
    max-width: 100%;
45
    background-color: transparent
46
}
47
48
th {
49
    text-align: left
50
}
51
52
h1, h2, h3 {
53
    font-size: 14px;
54
    font-weight: 400;
55
}
56
57
h4, h5, h6 {
58
    font-size: 100%;
59
    font-weight: 400;
60
}
61
62
button, input, select, textarea {
63
    font-size: 100%;
64
}
65
66
input, button, textarea, select, optgroup, option {
67
    font-family: inherit;
68
    font-size: inherit;
69
    font-style: inherit;
70
    font-weight: inherit;
71
    outline: 0;
72
}
73
74
pre {
75
    white-space: pre-wrap;
76
    white-space: -moz-pre-wrap;
77
    white-space: -pre-wrap;
78
    white-space: -o-pre-wrap;
79
    word-wrap: break-word;
80
}
81
82
83
/** 滚动条 **/
84
85
::-webkit-scrollbar {
86
    width: 10px;
87
    height: 10px;
88
}
89
90
::-webkit-scrollbar-button:vertical {
91
    display: none;
92
}
93
94
::-webkit-scrollbar-track, ::-webkit-scrollbar-corner {
95
    background-color: #e2e2e2;
96
}
97
98
::-webkit-scrollbar-thumb {
99
    border-radius: 0;
100
    background-color: rgba(0, 0, 0, .3);
101
}
102
103
::-webkit-scrollbar-thumb:vertical:hover {
104
    background-color: rgba(0, 0, 0, .35);
105
}
106
107
::-webkit-scrollbar-thumb:vertical:active {
108
    background-color: rgba(0, 0, 0, .38);
109
}
110
111
@font-face {
112
    font-family: 'jIcon';
113
    src: url('../font/iconfont.eot');
114
    src: url('../font/iconfont.eot?#iefix') format('embedded-opentype'), url('../font/iconfont.woff') format('woff'), url('../font/iconfont.ttf') format('truetype'), url('../font/iconfont.svg#iconfont') format('svg');
115
}
116
117
.icon, [class*=" icon-"], [class^="icon-"] {
118
    font-family: "jIcon" !important;
119
    font-size: 14px;
120
    font-style: normal;
121
    font-weight: 400;
122
    font-variant: normal;
123
    line-height: 1;
124
    text-transform: none;
125
    speak: none;
126
    -webkit-font-smoothing: antialiased;
127
    -moz-osx-font-smoothing: grayscale;
128
}
129
130
.icon-resize:before {
131
    content: '\e667';
132
}
133
134
.icon-expand-full:before {
135
    content: '\e6a3';
136
}
137
138
.icon-arrows-alt:before {
139
    content: '\e6a3';
140
}
141
142
.icon-fullscreen:before {
143
    content: '\e6a3';
144
}
145
146
.icon-collapse-full:before {
147
    content: '\e682';
148
}
149
150
.icon-yinyang:before {
151
    content: '\e687';
152
}
153
154
.icon-taiji:before {
155
    content: '\e687';
156
}
157
158
.icon-window:before {
159
    content: '\e68e';
160
}
161
162
.icon-window-alt:before {
163
    content: '\e68f';
164
}
165
166
.icon-carousel:before {
167
    content: '\e6b0';
168
}
169
170
.icon-spinner-snake:before {
171
    content: '\e97b';
172
}
173
174
.icon-spinner-indicator:before {
175
    content: '\e97c';
176
}
177
178
.icon-check-board:before {
179
    content: '\e9b8';
180
}
181
182
.icon-bar-chart:before {
183
    content: '\f080';
184
}
185
186
.icon-bar-chart-o:before {
187
    content: '\f080';
188
}
189
190
.icon-github:before {
191
    content: '\f09b';
192
}
193
194
.icon-dot-circle:before {
195
    content: '\f192';
196
}
197
198
.icon-dot-circle-o:before {
199
    content: '\f192';
200
}
201
202
.icon-cube-alt:before {
203
    content: '\f1b2';
204
}
205
206
.icon-cubes:before {
207
    content: '\f1b3';
208
}
209
210
.icon-file-pdf:before {
211
    content: '\f1c1';
212
}
213
214
.icon-file-word:before {
215
    content: '\f1c2';
216
}
217
218
.icon-file-excel:before {
219
    content: '\f1c3';
220
}
221
222
.icon-file-powerpoint:before {
223
    content: '\f1c4';
224
}
225
226
.icon-file-image:before {
227
    content: '\f1c5';
228
}
229
230
.icon-file-photo:before {
231
    content: '\f1c5';
232
}
233
234
.icon-file-picture:before {
235
    content: '\f1c5';
236
}
237
238
.icon-file-archive:before {
239
    content: '\f1c6';
240
}
241
242
.icon-file-zip:before {
243
    content: '\f1c6';
244
}
245
246
.icon-file-audio:before {
247
    content: '\f1c7';
248
}
249
250
.icon-file-sound:before {
251
    content: '\f1c7';
252
}
253
254
.icon-file-movie:before {
255
    content: '\f1c8';
256
}
257
258
.icon-file-video:before {
259
    content: '\f1c8';
260
}
261
262
.icon-file-code:before {
263
    content: '\f1c9';
264
}
265
266
.icon-circle-o-notch:before {
267
    content: '\f1ce';
268
}
269
270
.icon-qq:before {
271
    content: '\f600';
272
}
273
274
.icon-wechat:before {
275
    content: '\f1d7';
276
}
277
278
.icon-weixin:before {
279
    content: '\f1d7';
280
}
281
282
.icon-history:before {
283
    content: '\f1da';
284
}
285
286
.icon-circle-thin:before {
287
    content: '\f1db';
288
}
289
290
.icon-sliders:before {
291
    content: '\f1de';
292
}
293
294
.icon-newspaper-o:before {
295
    content: '\f1ea';
296
}
297
298
.icon-calculator:before {
299
    content: '\f1ec';
300
}
301
302
.icon-paint-brush:before {
303
    content: '\f1fc';
304
}
305
306
.icon-area-chart:before {
307
    content: '\f1fe';
308
}
309
310
.icon-pie-chart:before {
311
    content: '\f200';
312
}
313
314
.icon-line-chart:before {
315
    content: '\f201';
316
}
317
318
.icon-toggle-off:before {
319
    content: '\f204';
320
}
321
322
.icon-toggle-on:before {
323
    content: '\f205';
324
}
325
326
.icon-diamond:before {
327
    content: '\f219';
328
}
329
330
.icon-venus:before {
331
    content: '\f221';
332
}
333
334
.icon-mars:before {
335
    content: '\f222';
336
}
337
338
.icon-server:before {
339
    content: '\f233';
340
}
341
342
.icon-music:before {
343
    content: '\e602';
344
}
345
346
.icon-search:before {
347
    content: '\e603';
348
}
349
350
.icon-envelope:before {
351
    content: '\e604';
352
}
353
354
.icon-heart:before {
355
    content: '\e605';
356
}
357
358
.icon-star:before {
359
    content: '\e606';
360
}
361
362
.icon-star-empty:before {
363
    content: '\e607';
364
}
365
366
.icon-user:before {
367
    content: '\e608';
368
}
369
370
.icon-film:before {
371
    content: '\e609';
372
}
373
374
.icon-th-large:before {
375
    content: '\e60a';
376
}
377
378
.icon-th:before {
379
    content: '\e60b';
380
}
381
382
.icon-th-list:before {
383
    content: '\e60c';
384
}
385
386
.icon-ok:before {
387
    content: '\e60d';
388
}
389
390
.icon-check:before {
391
    content: '\e60d';
392
}
393
394
.icon-remove:before {
395
    content: '\d7';
396
}
397
398
.icon-times:before {
399
    content: '\d7';
400
}
401
402
.icon-zoom-in:before {
403
    content: '\e60f';
404
}
405
406
.icon-zoom-out:before {
407
    content: '\e610';
408
}
409
410
.icon-off:before {
411
    content: '\e611';
412
}
413
414
.icon-cog:before {
415
    content: '\e613';
416
}
417
418
.icon-trash:before {
419
    content: '\e614';
420
}
421
422
.icon-home:before {
423
    content: '\e615';
424
}
425
426
.icon-file-o:before {
427
    content: '\e616';
428
}
429
430
.icon-file-alt:before {
431
    content: '\e616';
432
}
433
434
.icon-time:before {
435
    content: '\e617';
436
}
437
438
.icon-download-alt:before {
439
    content: '\e618';
440
}
441
442
.icon-download:before {
443
    content: '\e619';
444
}
445
446
.icon-upload:before {
447
    content: '\e61a';
448
}
449
450
.icon-inbox:before {
451
    content: '\e61b';
452
}
453
454
.icon-play-circle:before {
455
    content: '\e61c';
456
}
457
458
.icon-repeat:before {
459
    content: '\e61d';
460
}
461
462
.icon-refresh:before {
463
    content: '\e61e';
464
}
465
466
.icon-list-alt:before {
467
    content: '\e61f';
468
}
469
470
.icon-lock:before {
471
    content: '\e620';
472
}
473
474
.icon-flag:before {
475
    content: '\e621';
476
}
477
478
.icon-headphones:before {
479
    content: '\e622';
480
}
481
482
.icon-volume-off:before {
483
    content: '\e623';
484
}
485
486
.icon-volume-up:before {
487
    content: '\e625';
488
}
489
490
.icon-qrcode:before {
491
    content: '\e626';
492
}
493
494
.icon-barcode:before {
495
    content: '\e627';
496
}
497
498
.icon-tag:before {
499
    content: '\e628';
500
}
501
502
.icon-tags:before {
503
    content: '\e629';
504
}
505
506
.icon-book:before {
507
    content: '\e62a';
508
}
509
510
.icon-bookmark:before {
511
    content: '\e62b';
512
}
513
514
.icon-print:before {
515
    content: '\e62c';
516
}
517
518
.icon-camera:before {
519
    content: '\e62d';
520
}
521
522
.icon-font:before {
523
    content: '\e62e';
524
}
525
526
.icon-bold:before {
527
    content: '\e62f';
528
}
529
530
.icon-align-justify:before {
531
    content: '\e636';
532
}
533
534
.icon-list:before {
535
    content: '\e637';
536
}
537
538
.icon-picture:before {
539
    content: '\e63b';
540
}
541
542
.icon-pencil:before {
543
    content: '\e63c';
544
}
545
546
.icon-map-marker:before {
547
    content: '\e63d';
548
}
549
550
.icon-adjust:before {
551
    content: '\e63e';
552
}
553
554
.icon-tint:before {
555
    content: '\e63f';
556
}
557
558
.icon-edit:before {
559
    content: '\e640';
560
}
561
562
.icon-share:before {
563
    content: '\e641';
564
}
565
566
.icon-checked:before {
567
    content: '\e642';
568
}
569
570
.icon-move:before {
571
    content: '\e643';
572
}
573
574
.icon-arrows:before {
575
    content: '\e643';
576
}
577
578
.icon-step-backward:before {
579
    content: '\e644';
580
}
581
582
.icon-fast-backward:before {
583
    content: '\e645';
584
}
585
586
.icon-backward:before {
587
    content: '\e646';
588
}
589
590
.icon-play:before {
591
    content: '\e647';
592
}
593
594
.icon-pause:before {
595
    content: '\e648';
596
}
597
598
.icon-stop:before {
599
    content: '\e649';
600
}
601
602
.icon-forward:before {
603
    content: '\e64a';
604
}
605
606
.icon-fast-forward:before {
607
    content: '\e64b';
608
}
609
610
.icon-step-forward:before {
611
    content: '\e64c';
612
}
613
614
.icon-eject:before {
615
    content: '\e64d';
616
}
617
618
.icon-chevron-left:before {
619
    content: '\e64e';
620
}
621
622
.icon-chevron-right:before {
623
    content: '\e64f';
624
}
625
626
.icon-plus-sign:before {
627
    content: '\e650';
628
}
629
630
.icon-minus-sign:before {
631
    content: '\e651';
632
}
633
634
.icon-remove-sign:before {
635
    content: '\e652';
636
}
637
638
.icon-ok-sign:before {
639
    content: '\e653';
640
}
641
642
.icon-check-circle:before {
643
    content: '\e653';
644
}
645
646
.icon-question-sign:before {
647
    content: '\e654';
648
}
649
650
.icon-info-sign:before {
651
    content: '\e655';
652
}
653
654
.icon-remove-circle:before {
655
    content: '\e657';
656
}
657
658
.icon-ok-circle:before {
659
    content: '\e658';
660
}
661
662
.icon-check-circle-o:before {
663
    content: '\e658';
664
}
665
666
.icon-ban-circle:before {
667
    content: '\e659';
668
}
669
670
.icon-arrow-left:before {
671
    content: '\e65a';
672
}
673
674
.icon-arrow-right:before {
675
    content: '\e65b';
676
}
677
678
.icon-arrow-up:before {
679
    content: '\e65c';
680
}
681
682
.icon-arrow-down:before {
683
    content: '\e65d';
684
}
685
686
.icon-share-alt:before {
687
    content: '\e65e';
688
}
689
690
.icon-resize-full:before {
691
    content: '\e65f';
692
}
693
694
.icon-resize-small:before {
695
    content: '\e660';
696
}
697
698
.icon-plus:before {
699
    content: '\e661';
700
}
701
702
.icon-minus:before {
703
    content: '\e662';
704
}
705
706
.icon-asterisk:before {
707
    content: '\e663';
708
}
709
710
.icon-exclamation-sign:before {
711
    content: '\e664';
712
}
713
714
.icon-gift:before {
715
    content: '\e665';
716
}
717
718
.icon-leaf:before {
719
    content: '\e666';
720
}
721
722
.icon-eye-open:before {
723
    content: '\e668';
724
}
725
726
.icon-eye-close:before {
727
    content: '\e669';
728
}
729
730
.icon-warning-sign:before {
731
    content: '\e66a';
732
}
733
734
.icon-plane:before {
735
    content: '\e66b';
736
}
737
738
.icon-calendar:before {
739
    content: '\e66c';
740
}
741
742
.icon-random:before {
743
    content: '\e66d';
744
}
745
746
.icon-comment:before {
747
    content: '\e66e';
748
}
749
750
.icon-chevron-up:before {
751
    content: '\e670';
752
}
753
754
.icon-chevron-down:before {
755
    content: '\e671';
756
}
757
758
.icon-shopping-cart:before {
759
    content: '\e673';
760
}
761
762
.icon-folder-close:before {
763
    content: '\e674';
764
}
765
766
.icon-folder-open:before {
767
    content: '\e675';
768
}
769
770
.icon-resize-v:before {
771
    content: '\e676';
772
}
773
774
.icon-resize-h:before {
775
    content: '\e677';
776
}
777
778
.icon-bar-chart-alt:before {
779
    content: '\e678';
780
}
781
782
.icon-camera-retro:before {
783
    content: '\e679';
784
}
785
786
.icon-key:before {
787
    content: '\e67a';
788
}
789
790
.icon-cogs:before {
791
    content: '\e67b';
792
}
793
794
.icon-comments:before {
795
    content: '\e67c';
796
}
797
798
.icon-thumbs-o-up:before {
799
    content: '\e67d';
800
}
801
802
.icon-thumbs-o-down:before {
803
    content: '\e67e';
804
}
805
806
.icon-star-half:before {
807
    content: '\e67f';
808
}
809
810
.icon-heart-empty:before {
811
    content: '\e680';
812
}
813
814
.icon-signout:before {
815
    content: '\e681';
816
}
817
818
.icon-pushpin:before {
819
    content: '\e683';
820
}
821
822
.icon-external-link:before {
823
    content: '\e684';
824
}
825
826
.icon-signin:before {
827
    content: '\e685';
828
}
829
830
.icon-trophy:before {
831
    content: '\e686';
832
}
833
834
.icon-upload-alt:before {
835
    content: '\e688';
836
}
837
838
.icon-lemon:before {
839
    content: '\e689';
840
}
841
842
.icon-phone:before {
843
    content: '\e68a';
844
}
845
846
.icon-check-empty:before {
847
    content: '\e68b';
848
}
849
850
.icon-bookmark-empty:before {
851
    content: '\e68c';
852
}
853
854
.icon-phone-sign:before {
855
    content: '\e68d';
856
}
857
858
.icon-credit:before {
859
    content: '\e690';
860
}
861
862
.icon-rss:before {
863
    content: '\e691';
864
}
865
866
.icon-hdd:before {
867
    content: '\e692';
868
}
869
870
.icon-bullhorn:before {
871
    content: '\e693';
872
}
873
874
.icon-bell:before {
875
    content: '\e694';
876
}
877
878
.icon-certificate:before {
879
    content: '\e695';
880
}
881
882
.icon-hand-right:before {
883
    content: '\e696';
884
}
885
886
.icon-hand-left:before {
887
    content: '\e697';
888
}
889
890
.icon-hand-up:before {
891
    content: '\e698';
892
}
893
894
.icon-hand-down:before {
895
    content: '\e699';
896
}
897
898
.icon-circle-arrow-left:before {
899
    content: '\e69a';
900
}
901
902
.icon-circle-arrow-right:before {
903
    content: '\e69b';
904
}
905
906
.icon-circle-arrow-up:before {
907
    content: '\e69c';
908
}
909
910
.icon-circle-arrow-down:before {
911
    content: '\e69d';
912
}
913
914
.icon-globe:before {
915
    content: '\e69e';
916
}
917
918
.icon-wrench:before {
919
    content: '\e69f';
920
}
921
922
.icon-tasks:before {
923
    content: '\e6a0';
924
}
925
926
.icon-filter:before {
927
    content: '\e6a1';
928
}
929
930
.icon-group:before {
931
    content: '\e6a4';
932
}
933
934
.icon-link:before {
935
    content: '\e6a5';
936
}
937
938
.icon-cloud:before {
939
    content: '\e6a6';
940
}
941
942
.icon-beaker:before {
943
    content: '\e6a7';
944
}
945
946
.icon-cut:before {
947
    content: '\e6a8';
948
}
949
950
.icon-copy:before {
951
    content: '\e6a9';
952
}
953
954
.icon-paper-clip:before {
955
    content: '\e6aa';
956
}
957
958
.icon-save:before {
959
    content: '\e6ab';
960
}
961
962
.icon-sign-blank:before {
963
    content: '\e6ac';
964
}
965
966
.icon-bars:before {
967
    content: '\e6ad';
968
}
969
970
.icon-reorder:before {
971
    content: '\e6ad';
972
}
973
974
.icon-list-ul:before {
975
    content: '\e6ae';
976
}
977
978
.icon-list-ol:before {
979
    content: '\e6af';
980
}
981
982
.icon-table:before {
983
    content: '\e6b2';
984
}
985
986
.icon-magic:before {
987
    content: '\e6b3';
988
}
989
990
.icon-caret-down:before {
991
    content: '\e6b8';
992
}
993
994
.icon-caret-up:before {
995
    content: '\e6b9';
996
}
997
998
.icon-caret-left:before {
999
    content: '\e6ba';
1000
}
1001
1002
.icon-caret-right:before {
1003
    content: '\e6bb';
1004
}
1005
1006
.icon-columns:before {
1007
    content: '\e6bc';
1008
}
1009
1010
.icon-sort:before {
1011
    content: '\e6bd';
1012
}
1013
1014
.icon-sort-down:before {
1015
    content: '\e6be';
1016
}
1017
1018
.icon-sort-up:before {
1019
    content: '\e6bf';
1020
}
1021
1022
.icon-envelope-alt:before {
1023
    content: '\e6c0';
1024
}
1025
1026
.icon-undo:before {
1027
    content: '\e6c1';
1028
}
1029
1030
.icon-dashboard:before {
1031
    content: '\e6c3';
1032
}
1033
1034
.icon-comment-alt:before {
1035
    content: '\e6c4';
1036
}
1037
1038
.icon-comments-alt:before {
1039
    content: '\e6c5';
1040
}
1041
1042
.icon-bolt:before {
1043
    content: '\e6c6';
1044
}
1045
1046
.icon-sitemap:before {
1047
    content: '\e6c7';
1048
}
1049
1050
.icon-umbrella:before {
1051
    content: '\e6c8';
1052
}
1053
1054
.icon-paste:before {
1055
    content: '\e6c9';
1056
}
1057
1058
.icon-lightbulb:before {
1059
    content: '\e6ca';
1060
}
1061
1062
.icon-exchange:before {
1063
    content: '\e6cb';
1064
}
1065
1066
.icon-cloud-download:before {
1067
    content: '\e6cc';
1068
}
1069
1070
.icon-cloud-upload:before {
1071
    content: '\e6cd';
1072
}
1073
1074
.icon-bell-alt:before {
1075
    content: '\e6d1';
1076
}
1077
1078
.icon-coffee:before {
1079
    content: '\e6d2';
1080
}
1081
1082
.icon-file-text-o:before {
1083
    content: '\e6d4';
1084
}
1085
1086
.icon-file-text-alt:before {
1087
    content: '\e6d4';
1088
}
1089
1090
.icon-building:before {
1091
    content: '\e6d5';
1092
}
1093
1094
.icon-double-angle-left:before {
1095
    content: '\e6dc';
1096
}
1097
1098
.icon-double-angle-right:before {
1099
    content: '\e6dd';
1100
}
1101
1102
.icon-double-angle-up:before {
1103
    content: '\e6de';
1104
}
1105
1106
.icon-double-angle-down:before {
1107
    content: '\e6df';
1108
}
1109
1110
.icon-angle-left:before {
1111
    content: '\e6e0';
1112
}
1113
1114
.icon-angle-right:before {
1115
    content: '\e6e1';
1116
}
1117
1118
.icon-angle-up:before {
1119
    content: '\e6e2';
1120
}
1121
1122
.icon-angle-down:before {
1123
    content: '\e6e3';
1124
}
1125
1126
.icon-desktop:before {
1127
    content: '\e6e4';
1128
}
1129
1130
.icon-laptop:before {
1131
    content: '\e6e5';
1132
}
1133
1134
.icon-tablet:before {
1135
    content: '\e6e6';
1136
}
1137
1138
.icon-mobile:before {
1139
    content: '\e6e7';
1140
}
1141
1142
.icon-circle-blank:before {
1143
    content: '\e6e8';
1144
}
1145
1146
.icon-quote-left:before {
1147
    content: '\e6e9';
1148
}
1149
1150
.icon-quote-right:before {
1151
    content: '\e6ea';
1152
}
1153
1154
.icon-spinner:before {
1155
    content: '\e6eb';
1156
}
1157
1158
.icon-circle:before {
1159
    content: '\e6ec';
1160
}
1161
1162
.icon-reply:before {
1163
    content: '\e6ed';
1164
}
1165
1166
.icon-folder-close-alt:before {
1167
    content: '\e6ef';
1168
}
1169
1170
.icon-folder-open-alt:before {
1171
    content: '\e6f0';
1172
}
1173
1174
.icon-expand-alt:before {
1175
    content: '\e6f1';
1176
}
1177
1178
.icon-collapse-alt:before {
1179
    content: '\e6f2';
1180
}
1181
1182
.icon-smile:before {
1183
    content: '\e6f3';
1184
}
1185
1186
.icon-frown:before {
1187
    content: '\e6f4';
1188
}
1189
1190
.icon-meh:before {
1191
    content: '\e6f5';
1192
}
1193
1194
.icon-gamepad:before {
1195
    content: '\e6f6';
1196
}
1197
1198
.icon-keyboard:before {
1199
    content: '\e6f7';
1200
}
1201
1202
.icon-flag-alt:before {
1203
    content: '\e6f8';
1204
}
1205
1206
.icon-flag-checkered:before {
1207
    content: '\e6f9';
1208
}
1209
1210
.icon-terminal:before {
1211
    content: '\e6fa';
1212
}
1213
1214
.icon-code:before {
1215
    content: '\e6fb';
1216
}
1217
1218
.icon-reply-all:before {
1219
    content: '\e6fc';
1220
}
1221
1222
.icon-star-half-full:before {
1223
    content: '\e6fd';
1224
}
1225
1226
.icon-location-arrow:before {
1227
    content: '\e6fe';
1228
}
1229
1230
.icon-crop:before {
1231
    content: '\e6ff';
1232
}
1233
1234
.icon-code-fork:before {
1235
    content: '\e700';
1236
}
1237
1238
.icon-unlink:before {
1239
    content: '\e701';
1240
}
1241
1242
.icon-question:before {
1243
    content: '\e702';
1244
}
1245
1246
.icon-info:before {
1247
    content: '\e703';
1248
}
1249
1250
.icon-shield:before {
1251
    content: '\e70b';
1252
}
1253
1254
.icon-calendar-empty:before {
1255
    content: '\e70c';
1256
}
1257
1258
.icon-rocket:before {
1259
    content: '\e70e';
1260
}
1261
1262
.icon-chevron-sign-left:before {
1263
    content: '\e70f';
1264
}
1265
1266
.icon-chevron-sign-right:before {
1267
    content: '\e710';
1268
}
1269
1270
.icon-chevron-sign-up:before {
1271
    content: '\e711';
1272
}
1273
1274
.icon-chevron-sign-down:before {
1275
    content: '\e712';
1276
}
1277
1278
.icon-html5:before {
1279
    content: '\e713';
1280
}
1281
1282
.icon-anchor:before {
1283
    content: '\e714';
1284
}
1285
1286
.icon-unlock-alt:before {
1287
    content: '\e715';
1288
}
1289
1290
.icon-bullseye:before {
1291
    content: '\e716';
1292
}
1293
1294
.icon-ellipsis-h:before {
1295
    content: '\e717';
1296
}
1297
1298
.icon-ellipsis-v:before {
1299
    content: '\e718';
1300
}
1301
1302
.icon-rss-sign:before {
1303
    content: '\e719';
1304
}
1305
1306
.icon-play-sign:before {
1307
    content: '\e71a';
1308
}
1309
1310
.icon-minus-sign-alt:before {
1311
    content: '\e71c';
1312
}
1313
1314
.icon-check-minus:before {
1315
    content: '\e71d';
1316
}
1317
1318
.icon-level-up:before {
1319
    content: '\e71e';
1320
}
1321
1322
.icon-level-down:before {
1323
    content: '\e71f';
1324
}
1325
1326
.icon-check-sign:before {
1327
    content: '\e720';
1328
}
1329
1330
.icon-edit-sign:before {
1331
    content: '\e721';
1332
}
1333
1334
.icon-external-link-sign:before {
1335
    content: '\e722';
1336
}
1337
1338
.icon-share-sign:before {
1339
    content: '\e723';
1340
}
1341
1342
.icon-compass:before {
1343
    content: '\e724';
1344
}
1345
1346
.icon-collapse:before {
1347
    content: '\e725';
1348
}
1349
1350
.icon-collapse-top:before {
1351
    content: '\e726';
1352
}
1353
1354
.icon-expand:before {
1355
    content: '\e727';
1356
}
1357
1358
.icon-dollar:before {
1359
    content: '\e728';
1360
}
1361
1362
.icon-yen:before {
1363
    content: '\e729';
1364
}
1365
1366
.icon-file:before {
1367
    content: '\e72b';
1368
}
1369
1370
.icon-file-text:before {
1371
    content: '\e72c';
1372
}
1373
1374
.icon-sort-by-alphabet:before {
1375
    content: '\e72d';
1376
}
1377
1378
.icon-sort-by-alphabet-alt:before {
1379
    content: '\e72e';
1380
}
1381
1382
.icon-sort-by-attributes:before {
1383
    content: '\e72f';
1384
}
1385
1386
.icon-sort-by-attributes-alt:before {
1387
    content: '\e730';
1388
}
1389
1390
.icon-sort-by-order:before {
1391
    content: '\e731';
1392
}
1393
1394
.icon-sort-by-order-alt:before {
1395
    content: '\e732';
1396
}
1397
1398
.icon-thumbs-up:before {
1399
    content: '\e733';
1400
}
1401
1402
.icon-thumbs-down:before {
1403
    content: '\e734';
1404
}
1405
1406
.icon-long-arrow-down:before {
1407
    content: '\e736';
1408
}
1409
1410
.icon-long-arrow-up:before {
1411
    content: '\e737';
1412
}
1413
1414
.icon-long-arrow-left:before {
1415
    content: '\e738';
1416
}
1417
1418
.icon-long-arrow-right:before {
1419
    content: '\e739';
1420
}
1421
1422
.icon-apple:before {
1423
    content: '\e73a';
1424
}
1425
1426
.icon-windows:before {
1427
    content: '\e73b';
1428
}
1429
1430
.icon-android:before {
1431
    content: '\e73c';
1432
}
1433
1434
.icon-linux:before {
1435
    content: '\e73d';
1436
}
1437
1438
.icon-sun:before {
1439
    content: '\e742';
1440
}
1441
1442
.icon-moon:before {
1443
    content: '\e743';
1444
}
1445
1446
.icon-archive:before {
1447
    content: '\e744';
1448
}
1449
1450
.icon-bug:before {
1451
    content: '\e745';
1452
}
1453
1454
.icon-zhifubao:before, .icon-alipay:before {
1455
    content: '\e901';
1456
}
1457
1458
.icon-zhifubao-square:before, .icon-alipay-square:before {
1459
    content: '\e900';
1460
}
1461
1462
.icon-taobao:before {
1463
    content: '\e902';
1464
}
1465
1466
.icon-weibo:before {
1467
    content: '\e746';
1468
}
1469
1470
.icon-renren:before {
1471
    content: '\e747';
1472
}
1473
1474
.icon-chrome:before {
1475
    content: '\e76c';
1476
}
1477
1478
.icon-firefox:before {
1479
    content: '\e76d';
1480
}
1481
1482
.icon-ie:before {
1483
    content: '\e76e';
1484
}
1485
1486
.icon-opera:before {
1487
    content: '\e76f';
1488
}
1489
1490
.icon-safari:before {
1491
    content: '\e770';
1492
}
1493
1494
.icon-node:before {
1495
    content: '\e76a';
1496
}
1497
1498
.icon-layout:before {
1499
    content: '\e768';
1500
}
1501
1502
.icon-usecase:before {
1503
    content: '\e74a';
1504
}
1505
1506
.icon-stack:before {
1507
    content: '\e769';
1508
}
1509
1510
.icon-branch:before {
1511
    content: '\e74b';
1512
}
1513
1514
.icon-chat:before {
1515
    content: '\e74c';
1516
}
1517
1518
.icon-chat-line:before {
1519
    content: '\e74f';
1520
}
1521
1522
.icon-comment-line:before {
1523
    content: '\e74f';
1524
}
1525
1526
.icon-chat-dot:before {
1527
    content: '\e750';
1528
}
1529
1530
.icon-cube:before {
1531
    content: '\e751';
1532
}
1533
1534
.icon-align-left:before {
1535
    content: '\e633';
1536
}
1537
1538
@-webkit-keyframes spin {
1539
    0% {
1540
        -webkit-transform: rotate(0deg);
1541
        transform: rotate(0deg);
1542
    }
1543
    100% {
1544
        -webkit-transform: rotate(359deg);
1545
        transform: rotate(359deg);
1546
    }
1547
}
1548
1549
@-o-keyframes spin {
1550
    0% {
1551
        -o-transform: rotate(0deg);
1552
        transform: rotate(0deg);
1553
    }
1554
    100% {
1555
        -o-transform: rotate(359deg);
1556
        transform: rotate(359deg);
1557
    }
1558
}
1559
1560
@keyframes spin {
1561
    0% {
1562
        -webkit-transform: rotate(0deg);
1563
        -o-transform: rotate(0deg);
1564
        transform: rotate(0deg);
1565
    }
1566
    100% {
1567
        -webkit-transform: rotate(359deg);
1568
        -o-transform: rotate(359deg);
1569
        transform: rotate(359deg);
1570
    }
1571
}
1572
1573
.icon-spin {
1574
    display: inline-block;
1575
    -webkit-animation: spin 2s infinite linear;
1576
    -o-animation: spin 2s infinite linear;
1577
    animation: spin 2s infinite linear;
1578
}
1579
1580
1581
/** 初始化全局标签 **/
1582
1583
body {
1584
    line-height: 24px;
1585
    font: 14px Helvetica Neue, Helvetica, PingFang SC, \5FAE\8F6F\96C5\9ED1, Tahoma, Arial, sans-serif;
1586
}
1587
1588
hr {
1589
    height: 1px;
1590
    margin: 10px 0;
1591
    border: 0;
1592
    background-color: #e2e2e2;
1593
    clear: both;
1594
}
1595
1596
a {
1597
    color: #333;
1598
    text-decoration: none;
1599
}
1600
1601
a:hover {
1602
    color: #777;
1603
}
1604
1605
a cite {
1606
    font-style: normal;
1607
    *cursor: pointer;
1608
}
1609
1610
1611
/* 消除第三方ui可能造成的冲突 */
1612
1613
.cbox, .cbox * {
1614
    -webkit-box-sizing: content-box !important;
1615
    -moz-box-sizing: content-box !important;
1616
    box-sizing: content-box !important;
1617
}
1618
1619
.bbox, .bbox * {
1620
    -webkit-box-sizing: border-box !important;
1621
    -moz-box-sizing: border-box !important;
1622
    box-sizing: border-box !important;
1623
}
1624
1625
.clear {
1626
    clear: both;
1627
    *zoom: 1;
1628
}
1629
1630
.clear:after {
1631
    content: '\20';
1632
    clear: both;
1633
    *zoom: 1;
1634
    display: block;
1635
    height: 0;
1636
}
1637
1638
.inline {
1639
    position: relative;
1640
    display: inline-block;
1641
    *display: inline;
1642
    *zoom: 1;
1643
    vertical-align: middle;
1644
}
1645
1646
1647
/* 三角形 */
1648
1649
.edge {
1650
    position: absolute;
1651
    width: 0;
1652
    height: 0;
1653
    border-style: dashed;
1654
    border-color: transparent;
1655
    overflow: hidden;
1656
}
1657
1658
1659
/* 单行溢出省略 */
1660
1661
.elip {
1662
    text-overflow: ellipsis;
1663
    overflow: hidden;
1664
    white-space: nowrap;
1665
}
1666
1667
1668
/* 屏蔽选中 */
1669
1670
.unselect {
1671
    -moz-user-select: none;
1672
    -webkit-user-select: none;
1673
    -ms-user-select: none;
1674
}
1675
1676
.disabled, .disabled:hover {
1677
    color: #d2d2d2 !important;
1678
    cursor: not-allowed !important;
1679
}
1680
1681
1682
/* 纯圆角 */
1683
1684
.circle {
1685
    border-radius: 100%;
1686
}
1687
1688
.show {
1689
    display: block !important;
1690
}
1691
1692
.hide {
1693
    display: none !important;
1694
}
1695
1696
.min-show {
1697
    position: absolute;
1698
    width: 1px;
1699
    height: 1px;
1700
}
1701
1702
#g_info {
1703
    position: absolute;
1704
    z-index: 9999999;
1705
    top: 0;
1706
    width: 100%;
1707
}
1708
1709
#g_loading {
1710
    position: absolute;
1711
    z-index: 9999998;
1712
    top: 0;
1713
    bottom: 0;
1714
    left: 0;
1715
    right: 0;
1716
    opacity: .5;
1717
    background-color: #245269;
1718
    filter: Alpha(opacity=50);
1719
}
1720
1721
#g_loading div {
1722
    position: absolute;
1723
    top: 50%;
1724
    left: 50%;
1725
    margin: -50px auto 0 -50px;
1726
    font-family: jIcon;
1727
    font-size: 100px;
1728
}
1729
1730
#g_loading div i:before {
1731
    font-size: 100px;
1732
}
1733
1734
.err-ctn, .warn-ctn, .msg-ctn {
1735
    color: #fff;
1736
    opacity: 0.5;
1737
    filter: Alpha(opacity=50);
1738
    position: relative;
1739
    padding: 10px 20px 10px 10px;
1740
    display: inline-block;
1741
    border-radius: 4px;
1742
    margin: 2px;
1743
}
1744
1745
.err-ctn {
1746
    background-color: #e64525;
1747
}
1748
1749
.warn-ctn {
1750
    background-color: #df8f0e;
1751
}
1752
1753
.msg-ctn {
1754
    background-color: #03b8cf;
1755
}
1756
1757
.err-ctn > i.icon:before, .warn-ctn > i.icon:before, .msg-ctn > i.icon:after {
1758
    content: '\d7';
1759
    position: absolute;
1760
    top: 5px;
1761
    right: 5px;
1762
    cursor: pointer;
1763
}
1764
1765
.btn {
1766
    display: inline-block;
1767
    padding: 5px 12px;
1768
    margin-bottom: 4px;
1769
    margin-top: 4px;
1770
    font-size: 14px;
1771
    font-weight: 400;
1772
    line-height: 1.42846154;
1773
    text-align: center;
1774
    white-space: nowrap;
1775
    vertical-align: middle;
1776
    cursor: pointer;
1777
    -webkit-user-select: none;
1778
    -moz-user-select: none;
1779
    -ms-user-select: none;
1780
    user-select: none;
1781
    border: 1px solid transparent;
1782
    border-radius: 4px;
1783
    -webkit-transition: all .4s cubic-bezier(.175, .885, .32, 1);
1784
    -o-transition: all .4s cubic-bezier(.175, .885, .32, 1);
1785
    transition: all .4s cubic-bezier(.175, .885, .32, 1)
1786
}
1787
1788
.btn:focus {
1789
    outline: thin dotted #333;
1790
    outline: 5px auto -webkit-focus-ring-color;
1791
    outline-offset: -2px
1792
}
1793
1794
.btn:focus, .btn:hover {
1795
    color: #353535;
1796
    text-decoration: none
1797
}
1798
1799
.btn.active, .btn:active {
1800
    background-image: none;
1801
    outline: 0;
1802
    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
1803
    box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125)
1804
}
1805
1806
.btn.disabled, .btn[disabled], fieldset[disabled] .btn {
1807
    pointer-events: none;
1808
    cursor: not-allowed;
1809
    filter: alpha(opacity=65);
1810
    -webkit-box-shadow: none;
1811
    box-shadow: none;
1812
    opacity: .65
1813
}
1814
1815
.btn {
1816
    color: #353535;
1817
    text-shadow: 0 1px 0 #fff;
1818
    background-color: #f2f2f2;
1819
    border-color: #bfbfbf
1820
}
1821
1822
.btn.active, .btn:active, .btn:focus, .btn:hover, .open .dropdown-toggle.btn {
1823
    color: #353535;
1824
    background-color: #dedede;
1825
    border-color: #a1a1a1;
1826
    -webkit-box-shadow: 0 2px 1px rgba(0, 0, 0, .1);
1827
    box-shadow: 0 2px 1px rgba(0, 0, 0, .1)
1828
}
1829
1830
.btn.active, .btn:active, .open .dropdown-toggle.btn {
1831
    background-color: #ccc;
1832
    background-image: none;
1833
    border-color: #a6a6a6;
1834
    -webkit-box-shadow: inset 0 4px 6px rgba(0, 0, 0, .15);
1835
    box-shadow: inset 0 4px 6px rgba(0, 0, 0, .15)
1836
}
1837
1838
.btn.disabled, .btn.disabled.active, .btn.disabled:active, .btn.disabled:focus, .btn.disabled:hover, .btn[disabled], .btn[disabled].active, .btn[disabled]:active, .btn[disabled]:focus, .btn[disabled]:hover, fieldset[disabled] .btn, fieldset[disabled] .btn.active, fieldset[disabled] .btn:active, fieldset[disabled] .btn:focus, fieldset[disabled] .btn:hover {
1839
    background-color: #f2f2f2;
1840
    border-color: #bfbfbf
1841
}
1842
1843
1844
/* layout */
1845
1846
.container {
1847
    padding-right: 10px;
1848
    padding-left: 10px;
1849
    margin-right: auto;
1850
    margin-left: auto;
1851
}
1852
1853
.row {
1854
    margin-right: -10px;
1855
    margin-left: -10px;
1856
    overflow: visible;
1857
}
1858
1859
.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 {
1860
    position: relative;
1861
    min-height: 1px;
1862
    padding-right: 10px;
1863
    padding-left: 10px;
1864
    float: left;
1865
}
1866
1867
.col-1 {
1868
    width: 8.33333333%;
1869
}
1870
1871
.col-2 {
1872
    width: 16.66666667%;
1873
}
1874
1875
.col-3 {
1876
    width: 25%;
1877
}
1878
1879
.col-4 {
1880
    width: 33.33333333%;
1881
}
1882
1883
.col-5 {
1884
    width: 41.66666667%;
1885
}
1886
1887
.col-6 {
1888
    width: 50%;
1889
}
1890
1891
.col-7 {
1892
    width: 58.33333333%
1893
}
1894
1895
.col-8 {
1896
    width: 66.66666667%;
1897
}
1898
1899
.col-9 {
1900
    width: 75%;
1901
}
1902
1903
.col-10 {
1904
    width: 83.33333333%
1905
}
1906
1907
.col-11 {
1908
    width: 91.66666667%;
1909
}
1910
1911
.col-12 {
1912
    width: 100%;
1913
}
1914
1915
.row::after {
1916
    content: " ";
1917
    display: table;
1918
    clear: both;
1919
}
1920
1921
.layer-shade {
1922
    background-color: #000;
1923
    opacity: .3;
1924
    filter: alpha(opacity=30);
1925
    position: absolute;
1926
    left: 0;
1927
    top: 0;
1928
    right: 0;
1929
    bottom: 0;
1930
}
1931
1932
.layer-ctn {
1933
    position: absolute;
1934
    left: 0;
1935
    top: 0;
1936
    right: 0;
1937
    bottom: 0;
1938
}
1939
1940
1941
/*.menu>.btn+.nav {
1942
	margin-top:15px
1943
}*/
1944
1945
1946
/*.spa-menu>.nav>li {
1947
	float:none
1948
}*/
1949
1950
1951
/*.spa-menu>.nav>li.nav-parent>a>.icon-fold {
1952
	position:absolute;
1953
	top:11px;
1954
	right:10px;
1955
	display:block;
1956
	filter:alpha(opacity=45);
1957
	opacity:.45;
1958
	-webkit-transition:all .5s;
1959
	-o-transition:all .5s;
1960
	transition:all .5s
1961
}
1962
.spa-menu>.nav>li.nav-parent>a:hover>.icon-fold{
1963
	filter:alpha(opacity=75);
1964
	opacity:.75
1965
}*/
1966
1967
.pull-left {
1968
    float: left;
1969
}
1970
1971
.pull-right {
1972
    float: right;
1973
}
1974
1975
.modal-ctrl {
1976
    display: none;
1977
}
1978
1979
.spa-modal > .centerModal {
1980
    position: absolute;
1981
    left: 50%;
1982
    top: 50%;
1983
    transform: translate(-50%, -50%);
1984
    max-height: 90%;
1985
    max-width: 90%;
1986
    background-color: #fff;
1987
    overflow: auto;
1988
}
1989
1990
.spa-modal > .centerModal > .modal-ctrl {
1991
    display: block;
1992
}
1993
1994
.spa-modal > .centerModal > .modal-ctrl:after {
1995
    display: table;
1996
    content: '';
1997
    clear: both;
1998
}
1999
2000
.spa-modal > .centerModal > .modal-ctrl > .icon-times {
2001
    float: right;
2002
    font-size: 25px;
2003
    padding: 10px;
2004
    margin-right: 0px;
2005
}
2006
2007
.nav {
2008
    padding-left: 0;
2009
    margin-bottom: 0;
2010
    list-style: none
2011
}
2012
2013
.nav > li {
2014
    position: relative;
2015
    position: relative;
2016
    display: block;
2017
}
2018
2019
.nav > li > a {
2020
    position: relative;
2021
    display: block;
2022
    padding: 15px 15px;
2023
}
2024
2025
.nav > li > a.nav-branch-hand {
2026
    font-weight: bold;
2027
}
2028
2029
.menu .icon.fold {
2030
    position: absolute;
2031
    top: 15px;
2032
    right: 15px;
2033
    font-weight: bold;
2034
}
2035
2036
.menu .icon.fold:before {
2037
    content: '\e6e3';
2038
}
2039
2040
.menu .open > a > .icon.fold:before {
2041
    content: '\e6e2';
2042
}
2043
2044
.menu li.nav-parent > .nav {
2045
    display: none;
2046
}
2047
2048
.menu > .nav > li > .nav > li > a {
2049
    padding-left: 35px;
2050
}
2051
2052
.menu > .nav > li > .nav > li > .nav > li > a {
2053
    padding-left: 55px;
2054
}
2055
2056
.menu > .nav > li > .nav > li > .nav > li > .nav > li > a {
2057
    padding-left: 75px;
2058
}
2059
2060
.menu a.nav-hand:focus, .menu a.nav-hand:hover {
2061
    /*background-color: #e4e4e4*/
2062
    color: blue;
2063
    background-color: #fff;
2064
}
2065
2066
.menu .nav > li > a > i:first-child {
2067
    display: inline-block;
2068
    margin-right: 10px;
2069
    color: grey
2070
}
2071
2072
.menu .nav-hand.active {
2073
    border-left: 3px solid red;
2074
    border-top: 1px solid #c7c7c7;
2075
    border-bottom: 1px solid #c7c7c7;
2076
    background-color: #fff;
2077
    color: blue;
2078
    margin-right: -1px;
2079
}
2080
2081
.menu li.open > .nav {
2082
    display: block
2083
}
2084
2085
.dd-ctn {
2086
    overflow: visible;
2087
}
2088
2089
.dd-drop {
2090
    display: none;
2091
}
2092
2093
.dd-ctn.open > .dd-drop {
2094
    display: block;
2095
    position: absolute;
2096
    top: 100%;
2097
    width: 100%;
2098
    left: 0px;
2099
    z-index: 200;
2100
    margin-top: -1px;
2101
    -webkit-background-clip: padding-box;
2102
    background-clip: padding-box;
2103
    border-radius: 0 0 4px 4px;
2104
    background: #fff;
2105
    border: 1px solid rgba(0, 0, 0, .15);
2106
    border-top: 0;
2107
    -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
2108
    box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
2109
}
2110
2111
.item-caption {
2112
    vertical-align: middle;
2113
    text-align: right;
2114
    padding-top: 10px;
2115
    padding-right: 0px;
2116
}
2117
2118
.item-caption.center {
2119
    text-align: center;
2120
}
2121
2122
.item-caption.required:after {
2123
    content: ' *';
2124
    color: red;
2125
}
2126
2127
.form-item {
2128
    font-size: 14px;
2129
    position: relative;
2130
    padding: 3px 0px;
2131
}
2132
.form-item,.form-item span,.form-item input,.form-item textarea{
2133
    color:#000000;
2134
}
2135
.form-item.readOnly,.form-item.readOnly span,.form-item.readOnly input,.form-item.readOnly textarea{
2136
    color:#555555;
2137
}
2138
2139
2140
.form-item.hidden {
2141
    display: none;
2142
}
2143
2144
.form-item.lable {}
2145
2146
2147
/*
2148
 * 
2149
 */
2150
2151
.form-item.text {}
2152
2153
.form-item.select {}
2154
2155
.form-item > a.dd-hand, .form-item.text > input, .form-item.textarea > textarea {
2156
    display: block;
2157
    width: 100%;
2158
    padding: 6px 6px;
2159
    overflow: hidden;
2160
    /*line-height: 1.53846154;*/
2161
    line-height: 1.42846154;
2162
/*    color: #555;*/
2163
    background-color: #fff;
2164
    background-image: none;
2165
    text-decoration: none;
2166
    vertical-align: middle;
2167
    -webkit-background-clip: padding-box;
2168
    background-clip: padding-box;
2169
    border: 1px solid #ccc;
2170
    border-radius: 4px;
2171
    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2172
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2173
    -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
2174
    -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2175
    transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
2176
    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2177
    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
2178
}
2179
2180
.form-item.select > a.dd-hand, .form-item.text > input, .form-item.date > a.dd-hand {
2181
    height: 34px;
2182
    white-space: nowrap;
2183
}
2184
2185
.form-item > a.dd-hand > i.icon-drop {
2186
    display: block;
2187
    position: absolute;
2188
    top: 10px;
2189
    right: 10px;
2190
}
2191
2192
.form-item > a.dd-hand > i.icon-drop:before {
2193
    content: '\e671';
2194
}
2195
2196
.form-item.open > .dd-hand > .icon-drop:before {
2197
    content: '\e670';
2198
}
2199
2200
.form-item > .dd-hand > .icon-close ,.form-item .dd-hand >ul>li>.icon-close {
2201
    position: absolute;
2202
    top: 10px;
2203
    right: 30px;
2204
    font-size: 10px;
2205
    cursor: pointer;
2206
}
2207
2208
.form-item > a.dd-hand > span ~ i.icon-close:before,.form-item .dd-hand >ul>li>.icon-close:before {
2209
    content: '\e652';
2210
}
2211
2212
.form-item > a.dd-hand > span:empty ~ i.icon-close:before, {
2213
    content: '';
2214
}
2215
.form-item.showOnly > a.dd-hand i.icon-close:before {
2216
    content: '';
2217
}
2218
2219
2220
.form-item.mselect > .dd-hand > ul {
2221
    float: left;
2222
}
2223
2224
.form-item .dd-drop > ul {
2225
    position: relative;
2226
    max-height: 240px;
2227
    padding: 0;
2228
    margin: 0;
2229
    overflow-x: hidden;
2230
    overflow-y: auto;
2231
}
2232
2233
.form-item .dd-drop .branch-item > a {
2234
    display: list-item;
2235
    cursor: pointer;
2236
    padding: 5px 10px;
2237
    margin: 0;
2238
    line-height: 15px;
2239
    list-style: none;
2240
    -webkit-transition: background-color .2s cubic-bezier(.175, .885, .32, 1);
2241
    -o-transition: background-color .2s cubic-bezier(.175, .885, .32, 1);
2242
    transition: background-color .2s cubic-bezier(.175, .885, .32, 1);
2243
    -webkit-touch-callout: none;
2244
    font-weight: bold;
2245
    position: relative;
2246
    padding-right: 20px;
2247
}
2248
2249
.form-item .dd-drop .branch-item > ul {
2250
    display: none;
2251
}
2252
2253
.form-item .dd-drop .branch-item > a > i {
2254
    position: absolute;
2255
    top: 8px;
2256
    right: 10px;
2257
}
2258
2259
.form-item .dd-drop .branch-item > a > i:before {
2260
    content: '\e64f';
2261
}
2262
2263
.form-item .dd-drop .branch-item > a.open + ul {
2264
    display: block;
2265
    padding: 0 0 0 10px;
2266
}
2267
2268
.form-item .dd-drop .branch-item > a.open > i:before {
2269
    content: '\e64e';
2270
}
2271
2272
.form-item .dd-drop .select-item {
2273
    display: list-item;
2274
    cursor: pointer;
2275
    padding: 5px 10px;
2276
    margin: 0;
2277
    line-height: 15px;
2278
    list-style: none;
2279
    -webkit-transition: background-color .2s cubic-bezier(.175, .885, .32, 1);
2280
    -o-transition: background-color .2s cubic-bezier(.175, .885, .32, 1);
2281
    transition: background-color .2s cubic-bezier(.175, .885, .32, 1);
2282
    -webkit-touch-callout: none;
2283
}
2284
2285
.form-item .dd-drop .select-item:hover {
2286
    color: #fff;
2287
    background-color: #3280fc;
2288
}
2289
2290
.form-item .dd-hand > ul > li {
2291
    float: left;
2292
    position: relative;
2293
}
2294
2295
.form-item .select-caption {
2296
    padding-right: 18px;
2297
    float: left;
2298
    padding: 2px 12px 2px 5px;
2299
    border: 1px solid #ccc;
2300
    border-radius: 4px;
2301
    margin-right: 5px;
2302
    line-height: 1;
2303
}
2304
2305
.form-item .dd-hand > ul > li>i.icon-close {
2306
    position: absolute;
2307
    top: 0px;
2308
    right: 0px;
2309
    display: block;
2310
    height: 20px;
2311
    padding: 0 3px 10px;
2312
    font-size: 12px;
2313
    line-height: 1;
2314
}
2315
2316
.form-item .dd-hand>.placeholder{
2317
	display:none;
2318
}
2319
.form-item .dd-hand>ul:empty~.placeholder,.form-item .dd-hand[code=""]>.placeholder{
2320
	display:block;
2321
	color:#A4A4A4;
2322
}
2323
.form-item.readOnly .placeholder,.form-item.showOnly .placeholder{
2324
	color:transparent !important;
2325
}
2326
2327
.form-item.checkbox {}
2328
2329
.form-item.radio {}
2330
2331
.form-item.textarea {}
2332
2333
.form-item.datetime {}
2334
2335
.form-item.date {}
2336
2337
.form-item.time {}
2338
2339
.form-item.year {}
2340
2341
.form-item.yearMonth {}
2342
2343
.form-item.month {}
2344
2345
.form-item.day {}
2346
2347
.form-item.monthDay {}
2348
2349
.form-item.date.dd-ctn > .dd-drop {
2350
    left: 0;
2351
    width: auto;
2352
    min-width: 160px;
2353
}
2354
2355
.form-item.date.dd-ctn > .dd-drop:before {
2356
    top: -7px;
2357
    left: 6px;
2358
    position: absolute;
2359
    display: inline-block;
2360
    /*content: '';*/
2361
    border-right: 7px solid transparent;
2362
    border-bottom: 7px solid #ccc;
2363
    border-bottom-color: rgba(0, 0, 0, .2);
2364
    border-left: 7px solid transparent;
2365
}
2366
2367
.form-item.dd-ctn .dd-drop .day td, form-item.dd-ctn .dd-drop .day th {
2368
    width: 22px;
2369
    height: 20px;
2370
    padding: 6px 6px;
2371
    text-align: center;
2372
    border: none;
2373
    border-radius: 4px;
2374
}
2375
2376
.form-item.dd-ctn .dd-drop .day td, th.prev-year, th.prev-month, th.next-year, th.next-month {
2377
    cursor: pointer;
2378
}
2379
2380
.form-item.dd-ctn .dd-drop .day td:hover {
2381
    background-color: blue;
2382
    color: white;
2383
}
2384
2385
.form-item.dd-ctn .dd-drop .day td.no-current-month {
2386
    color: #CCCCCC;
2387
}
2388
2389
.form-item.dd-ctn .dd-drop .day td.no-current-month:hover {
2390
    background-color: #eee;
2391
}
2392
2393
.form-item.text:not(.readOnly) > input:focus {
2394
    border-color: #66afe9;
2395
    outline: 0;
2396
    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
2397
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
2398
}
2399
2400
.form-item.readOnly i,.form-item.showOnly i{
2401
	display:none !important;
2402
}
2403
2404
.form-item.showOnly.text {
2405
    padding: 10px 6px;
2406
}
2407
2408
.form-item.showOnly > a.dd-hand {
2409
    border-color: transparent;
2410
    -webkit-box-shadow: 0 0 0 transparent;
2411
    box-shadow: 0 0 0 transparent;
2412
}
2413
2414
.form-item.showOnly > a.dd-hand > i.icon:before {
2415
    content: "";
2416
}
2417
2418
.form-item.showOnly .select-caption {
2419
    border-color: transparent;
2420
}
2421
2422
2423
.upload-form input {
2424
    position: absolute;
2425
    top: 0px;
2426
    left: 0px;
2427
    right: 0px;
2428
    right: 0px;
2429
    z-index: 10;
2430
    font-size: 400px;
2431
    opacity: .01;
2432
    filter: Alpha(opacity=1);
2433
    cursor: pointer;
2434
}
2435
2436
.table {
2437
    width: 100%;
2438
    margin-bottom: 20px
2439
}
2440
2441
.table td, .table th {
2442
    padding: 8px;
2443
    line-height: 1.53846154;
2444
    vertical-align: top;
2445
    border-bottom: 1px solid #ddd;
2446
    -webkit-transition: background .2s cubic-bezier(.175, .885, .32, 1);
2447
    -o-transition: background .2s cubic-bezier(.175, .885, .32, 1);
2448
    transition: background .2s cubic-bezier(.175, .885, .32, 1)
2449
}
2450
2451
.table > thead > tr > th {
2452
    vertical-align: bottom;
2453
    background-color: #f1f1f1;
2454
    border-bottom: 1px solid #ddd
2455
}
2456
2457
.table > tbody + tbody {
2458
    border-top: 2px solid #ddd
2459
}
2460
2461
.table-fixed {
2462
    table-layout: fixed
2463
}
2464
2465
.table-fixed td, .table-fixed th {
2466
    overflow: hidden;
2467
    white-space: nowrap
2468
}
2469
2470
.table-fixed .nofixed, .table-fixed tfoot > tr > td, .table-fixed tfoot > tr > th {
2471
    overflow: visible
2472
}
2473
2474
.table-borderless td, .table-borderless th, .table-borderless thead > tr > th {
2475
    border: none
2476
}
2477
2478
.table-auto {
2479
    width: auto;
2480
    max-width: 100%
2481
}
2482
2483
.table-condensed td, .table-condensed th {
2484
    padding: 5px
2485
}
2486
2487
.table-bordered {
2488
    border: 1px solid #ddd
2489
}
2490
2491
.table-bordered td, .table-bordered th {
2492
    border: 1px solid #ddd
2493
}
2494
2495
.table-striped > tbody > tr:nth-child(odd) > td, .table-striped > tbody > tr:nth-child(odd) > th {
2496
    background-color: #f9f9f9
2497
}
2498
2499
.table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th {
2500
    background-color: #ebf2f9
2501
}
2502
2503
table col[class*=col-] {
2504
    display: table-column;
2505
    float: none
2506
}
2507
2508
table td[class*=col-], table th[class*=col-] {
2509
    display: table-cell;
2510
    float: none
2511
}
2512
2513
.table tr.active > td, .table tr.active > th, .table tr > td.active, .table tr > th.active {
2514
    background-color: #ffe7bc
2515
}
2516
2517
.table > tbody > tr.success > td, .table > tbody > tr.success > th, .table > tbody > tr > td.success, .table > tbody > tr > th.success, .table > tfoot > tr.success > td, .table > tfoot > tr.success > th, .table > tfoot > tr > td.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, .table > thead > tr > td.success, .table > thead > tr > th.success {
2518
    background-color: #ddf4df;
2519
    border-color: #bae8b6
2520
}
2521
2522
.table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr.success:hover > th, .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover {
2523
    background-color: #caeecd;
2524
    border-color: #a8e1a3
2525
}
2526
2527
.table > tbody > tr.danger > td, .table > tbody > tr.danger > th, .table > tbody > tr > td.danger, .table > tbody > tr > th.danger, .table > tfoot > tr.danger > td, .table > tfoot > tr.danger > th, .table > tfoot > tr > td.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, .table > thead > tr > td.danger, .table > thead > tr > th.danger {
2528
    background-color: #ffe5e0;
2529
    border-color: #ffc6c7
2530
}
2531
2532
.table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr.danger:hover > th, .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover {
2533
    background-color: #ffd0c6;
2534
    border-color: #ffadad
2535
}
2536
2537
.table > tbody > tr.warning > td, .table > tbody > tr.warning > th, .table > tbody > tr > td.warning, .table > tbody > tr > th.warning, .table > tfoot > tr.warning > td, .table > tfoot > tr.warning > th, .table > tfoot > tr > td.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, .table > thead > tr > td.warning, .table > thead > tr > th.warning {
2538
    background-color: #fff0d5;
2539
    border-color: #ffdcbc
2540
}
2541
2542
.table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr.warning:hover > th, .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover {
2543
    background-color: #ffe7bc;
2544
    border-color: #ffcea2
2545
}
2546
2547
.table-responsive {
2548
    min-height: .01%;
2549
    overflow-x: auto
2550
}
2551
2552
.table td.empty-desc {
2553
    text-align: center;
2554
    font-size: 30px;
2555
}
2556
2557
.dt-pager {
2558
    display: inline-block;
2559
    padding: 0 10px;
2560
    margin: 0px auto;
2561
    list-style: none
2562
}
2563
2564
.dt-pager li {
2565
    display: inline;
2566
}
2567
2568
.dt-pager li a {
2569
    position: relative;
2570
    float: left;
2571
    padding: 5px 12px;
2572
    margin-left: -1px;
2573
    line-height: 1.53846154;
2574
    text-decoration: none;
2575
    background-color: #fff;
2576
    border: 1px solid #ddd;
2577
    cursor: default;
2578
}
2579
2580
.dt-pager li.curr a {
2581
    color: #fff;
2582
    background-color: #3280fc;
2583
    border-color: #3280fc;
2584
}
2585
2586
.dt-pager li.active a {
2587
    color: #145ccd;
2588
    cursor: pointer;
2589
}
2590
2591
.dt-pager li.disabled a {
2592
    color: #ddd;
2593
    pointer-events: none;
2594
    cursor: not-allowed;
2595
    background-color: #fff;
2596
    border-color: #ddd;
2597
}
2598
2599
.opt-check .icon-st-check:before {
2600
    content: '\e68b';
2601
    cursor: pointer;
2602
}
2603
2604
.opt-check .icon-st-check.checked:before {
2605
    content: '\e642';
2606
}
2607
2608
.modal-dialog {
2609
    position: absolute;
2610
    max-width: 90%;
2611
    max-height: 90%;
2612
    min-width: 400px;
2613
    top: 50%;
2614
    left: 50%;
2615
    transform: translate(-50%, -50%);
2616
    background-color: #fff;
2617
    border: 1px solid rgba(0, 0, 0, .2);
2618
    border-radius: 6px;
2619
    box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
2620
}
2621
2622
.modal-dialog .modal-header {
2623
    min-height: 16.54px;
2624
    padding: 15px;
2625
    border-bottom: 1px solid #e5e5e5;
2626
}
2627
2628
.modal-dialog .modal-header .modal-title {
2629
    margin: 0;
2630
    line-height: 1.53846154;
2631
    font-weight: 700;
2632
}
2633
2634
.modal-dialog .modal-body {
2635
    padding: 15px;
2636
}
2637
2638
.modal-dialog .modal-footer {
2639
    padding: 15px;
2640
    text-align: right;
2641
    border-top: 1px solid #e5e5e5;
2642
}
2643
2644
.modal-dialog .modal-footer button {
2645
    margin-left: 10px;
2646
}
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
.invalid-dict{
2662
	color:red !important;
2663
}

+ 74 - 0
html/demo.html

@ -0,0 +1,74 @@
1
<!DOCTYPE html>
2
<html>
3

4
	<head>
5
		<meta charset="UTF-8">
6
		<title></title>
7
		<link rel="stylesheet" href="../css/common.css" />
8
		<script type="text/javascript" src="../js/jquery-1.12.4.js"></script>
9
	</head>
10

11
	<body>
12
		<div class="container">
13
			<div class="row">
14
				<div class="col-6 form-item text readOnly" name="t1" placeholder="dfsafsdfsdfda" defVal="dfsasfds">
15

16
				</div>
17
				<div class="col-6 form-item text int readOnly" name="t2" defVal="12345">
18

19
				</div>
20
			</div>
21
			<div class="row">
22
				<div class="col-6 form-item select readOnly"  dictCode="bool" name="t3" placeholder="123456789">
23

24
				</div>
25
				<div class="col-6 form-item mselect tree " dictCode="tree"   placeholder="123456789" name="t4">
26

27
				</div>
28
			</div>
29
			<div class="row">
30
				<div class="col-6 form-item date readOnly" defVal="current" name="t5" placeholder="dfsafsdfsdfda">
31

32
				</div>
33
				<div class="col-6 form-item textarea readOnly"  name="t6" placeholder="dfsafsdfsdfda">
34

35
				</div>
36
			</div>
37

38
		</div>
39
		<button type="button" class="opt-btn btn">btn</button>
40
		<script type="text/javascript" src="../js/common.js"></script>
41
		<script type="text/javascript" src="../js/util.js"></script>
42
		<script type="text/javascript" src="../js/dict.js"></script>
43
		<script type="text/javascript" src="../js/dropdown.js"></script>
44
		<script type="text/javascript" src="../js/form.js"></script>
45
		<script type="text/javascript" src="../js/text.js"></script>
46
		<script type="text/javascript" src="../js/select.js"></script>
47
		<script type="text/javascript" src="../js/date.js" ></script>
48
		<script type="text/javascript" src="../js/textarea.js" ></script>
49
		<script>
50
			$.use(["form", "dict"], function($f, $dict) {
51
				$dict.set("tree", [{ code: "0", caption: "否", enabled: true },
52
					{ code: "1", caption: "11否", enabled: true },
53
					{ code: "2", caption: "22否", enabled: true }, 
54
					{ code: "3", caption: "33否", enabled: true }, 
55
					{ code: "4", caption: "44否", enabled: true }, 
56
					{ code: "5", caption: "55否", enabled: true ,children:[{ code: "6", caption: "否", enabled: true }, 
57
					{ code: "7", caption: "否", enabled: true }, 
58
					{ code: "8", caption: "否", enabled: true }, 
59
					{ code: "9", caption: "否", enabled: true }, 
60
					{ code: "10", caption: "否", enabled: true }, ]}, 
61
					
62
					{ code: "11", caption: "666否", enabled: true },
63
				])
64

65
				var form = $f.build($(".container"));
66
				$(".opt-btn").on("click", function() {
67
					console.log(form.val());
68
				});
69

70
			})
71
		</script>
72
	</body>
73

74
</html>

+ 8 - 3
js/codehtml.js

@ -356,16 +356,16 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
356 356
				}
357 357
			};
358 358
		},
359
		defBh = function(data) { return data; },
360 359
		parseCode(ele) = function(ele) {
361 360
			var hand = parseElement(ele),
362 361
				$ele = $(ele),
363
				bh = defBh,
362
				bh = util.nochange,
364 363
				lses = [];
365 364
			return $.extend(hand, {
366 365
				"val": function(data) {
367
					$ele.empty();
368 366
					data = bh(data);
367
					if(false === data) return this;
368
					$ele.empty();
369 369
					var docf = doc.createDocumentFragment();
370 370
					this.fill(docf, data);
371 371
					ele.appendChild(docf);
@ -381,6 +381,11 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
381 381
				"listen": function(h) {
382 382
					if(h) lses.push(h);
383 383
					return this;
384
				},
385
				"before": function(h) {
386
					if(h) {
387
						bh = h;
388
					}
384 389
				}
385 390
			});
386 391
		},

+ 2 - 2
js/common.js

@ -21,7 +21,7 @@ if(typeof jQuery === 'undefined') {
21 21
		try {
22 22
			var md = factory.apply(win, dm);
23 23
			mds[id] = md;
24
		} catch {
24
		} catch(err) {
25 25
			throw new Error("build model[" + id + "] error");
26 26
		}
27 27
	};
@ -37,4 +37,4 @@ if(typeof jQuery === 'undefined') {
37 37
		}
38 38
		handle.apply(win, dm);
39 39
	};
40
})(jQuery, window, document);
40
})(jQuery, window, document);

+ 52 - 0
js/datagrid.js

@ -0,0 +1,52 @@
1
$.define(["jQuery", "util", "form", "code"], "dataGrid", function($, util, form, code) {
2
	var qf = ".dt-form",
3
		qt = ".dt-tpl",
4
		derr = {},
5
		dajaxCfg = {},
6
		build = function($e, options) {
7
			if($e.length && $e.length === 1) {
8
				var config = { e: derr, ajax: dajaxCfg };
9
				var ele = config.ele = $($e[0]);
10
				config.f = form.build(ele.find(qf));
11
				config.c = code.parseCode(ele.find(qt)[0]);
12
				config.uri = ele.attr("loadUri");
13
				if(options) {
14
					//						if(option.error) {
15
					//							config.e = option.error;
16
					//						}
17
					//						if(option.ajax) {
18
					//							config.ajax = option.ajax;
19
					//						}
20
					//						if(option.beforeFill) {
21
					//							config.c.before(option.beforeFill);
22
					//						}
23
					$.extend(config, options);
24
				}
25
				return {
26
					code: config.c;
27
					form: config f;
28
					load: function() {
29
						config.f.doGet(config.uri, function(data) {
30
							config.c.val(data);
31
						}, config.e, config.ajax);
32
					},
33
					error: function(eh) {
34
						config.e = eh;
35
					},
36
					beforeFill: function(h) {
37
						config.c.before(h);
38
					},
39
					ajaxConfig: function(cfg) {
40
						config.ajax = cfg;
41
					}
42
				}
43
			}
44
		};
45

46
	$.fn.dg = function(option) {
47
		if(this.length && this.length === 1) {
48
			return build(this, option);
49
		}
50
	};
51
	return { build: build };
52
});

+ 258 - 0
js/date.js

@ -0,0 +1,258 @@
1
$.use(["jQuery", "form", "doc", "util", "dropdown"], function($, form, doc, util, dd) {
2
	var readOnly = "readOnly",
3
		dd_ctn = "dd-ctn",
4
		dd_clean = "dd-clean",
5
		showOnly = "showOnly",
6
		modelName = 'date',
7
		def = "defVal",
8
		placeholder = "placeholder",
9
		required = "required",
10

11
		date_year = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
12
		date_leapYear = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
13
		date_isleap = function(y) {
14
			return(y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;
15
		},
16
		date_validDate = function(v) {
17
			if(v.length != 8) return false;
18
			for(var i = 0; i < 8; ++i) {
19
				var c = v.charAt(i);
20
				if(c > '9' || c < '0') return false;
21
			}
22
			var m = parseInt(v.substring(4, 6)) - 1;
23
			if(m < 0 || m > 11) return false;
24
			var d = parseInt(v.substring(6, 8));
25
			var ym = date_isleap(parseInt(v.substring(0, 4))) ? date_leapYear : date_year;
26
			if(d < 1 || d > ym[m]) return false;
27
			return true;
28
		},
29
		date_fmt = function(v) {
30
			return(v > 9 ? "" : "0") + v;
31
		},
32
		date_MS_IN_DAY = 24 * 60 * 60 * 1000,
33
		date_incDay = function(d) {
34
			return new Date(d.getTime() + date_MS_IN_DAY);
35
		},
36
		date_decDay = function(d) {
37
			return new Date(d.getTime() - date_MS_IN_DAY);
38
		},
39
		date_dayFmt = function(d) {
40
			return "" + d.getFullYear() + date_fmt(d.getMonth() + 1) + date_fmt(d.getDate());
41
		},
42
		date_now = function() {
43
			var d = new Date();
44
			return "" + d.getFullYear() + date_fmt(d.getMonth() + 1) + date_fmt(d.getDate()) + date_fmt(d.getHours()) + date_fmt(d.getMinutes()) + date_fmt(d.getSeconds());
45
		},
46
		table_year = { an: "year", av: "" },
47
		table_month = { an: "month", av: "" },
48
		daySwitch = [""],
49
		thead = {
50
			tn: "thead",
51
			chs: [{
52
				tn: "tr",
53
				chs: [
54
					{ tn: "th", attrs: [{ an: "class", av: "prev-year" }], chs: [{ tn: "i", attrs: [{ an: "class", av: "icon-arrow-left" }] }] },
55
					{ tn: "th", attrs: [{ an: "class", av: "prev-month" }], chs: [{ tn: "i", attrs: [{ an: "class", av: "icon-chevron-left" }] }] },
56
					{ tn: "th", attrs: [{ an: "class", av: "switch" }, { an: "colspan", av: "3" }], chs: daySwitch },
57
					{ tn: "th", attrs: [{ an: "class", av: "next-month" }], chs: [{ tn: "i", attrs: [{ an: "class", av: "icon-chevron-right" }] }] },
58
					{ tn: "th", attrs: [{ an: "class", av: "next-year" }], chs: [{ tn: "i", attrs: [{ an: "class", av: "icon-arrow-right" }] }] }
59
				]
60
			}, {
61
				tn: "tr",
62
				chs: [
63
					{ tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["日"] },
64
					{ tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["一"] },
65
					{ tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["二"] },
66
					{ tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["三"] },
67
					{ tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["四"] },
68
					{ tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["五"] },
69
					{ tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["六"] },
70
				]
71
			}]
72
		},
73
		tbody = { tn: "tbody" },
74
		tfoot = { tn: "tfoot" },
75
		table = { tn: "table", attrs: [{ an: "class", av: "day" }, table_year, table_month], chs: [thead, tbody, tfoot] },
76
		date_drop = { tn: "div", attrs: [{ an: "class", av: "dd-drop date" }], chs: [table] },
77
		show_day = function($e, y, m) {
78
			table_year.av = "" + y;
79
			table_month.av = "" + (m + 1);
80
			daySwitch[0] = date_fmt(m + 1) + "月 " + y + "年";
81
			var dd = new Date();
82
			dd.setFullYear(y);
83
			dd.setMonth(m);
84
			dd.setDate(1);
85
			var dayInWeek = dd.getDay();
86
			tbody.chs = [];
87
			var weekDays = { tn: "tr" };
88
			var days = weekDays.chs = [];
89
			for(var i = 0; i < dayInWeek; ++i) {
90
				var cd = date_dayFmt(new Date(dd.getTime() - ((dayInWeek - i) * date_MS_IN_DAY)));
91
				days.push({ tn: "td", attrs: [{ an: "class", av: "no-current-month" }, { an: "day", av: "" + cd }], chs: [cd.substring(6, 8)] });
92
			}
93
			var ld = date_isleap(y) ? date_leapYear[m] : date_year[m];
94
			for(var i = 0; i < ld; ++i) {
95
				var cd = date_dayFmt(dd);
96
				days.push({ tn: "td", attrs: [{ an: "class", av: "day-item" }, { an: "day", av: "" + cd }], chs: [cd.substring(6, 8)] });
97
				if(dd.getDay() == 6) {
98
					tbody.chs.push(weekDays);
99
					weekDays = { tn: "tr" };
100
					days = weekDays.chs = [];
101
				}
102
				dd = date_incDay(dd);
103
			}
104
			dayInWeek = dd.getDay();
105
			if(dayInWeek) {
106
				for(var i = dayInWeek; i < 7; ++i) {
107
					var cd = date_dayFmt(dd);
108
					days.push({ tn: "td", attrs: [{ an: "class", av: "no-current-month" }, { an: "day", av: "" + cd }], chs: [cd.substring(6, 8)] });
109
					dd = date_incDay(dd);
110
				}
111
				tbody.chs.push(weekDays);
112
			}
113
			$e.find(".dd-drop").remove();
114
			util.appendChild($e[0], date_drop);
115
		},
116

117
		handCode = { an: "code", av: "" },
118
		pa = [""],
119
		jhref = { an: "href", av: "javascript:;" },
120
		dd_hand = { an: "class", av: "dd-hand" },
121
		icon_drop = { tn: "i", attrs: [{ an: "class", av: "icon icon-drop" }] },
122
		icon_close = { tn: "i", attrs: [{ an: "class", av: "icon icon-close" }] },
123
		a_placeHolder = { tn: "a", attrs: [jhref, { an: "class", av: placeholder }], chs: pa },
124
		hand = {
125
			tn: "a",
126
			attrs: [
127
				dd_hand,
128
				jhref,
129
				handCode,
130
			],
131
			chs: [
132
				icon_drop,
133
				{ tn: "span" },
134
				icon_close,
135
				a_placeHolder,
136
			]
137
		};
138
	form.register(function($e) {
139
		var cls = util.classCheck($e[0], [readOnly, showOnly, modelName, required]),
140
			rv;
141
		if(cls[modelName]) {
142
			var n = $e.attr("name") || $e.attr("id"),
143
				rules = [];
144
			if(!n) {
145
				throw "Attribute[name] is invalid";
146
			}
147
			var dv = $e.attr(def) || "";
148

149
			$e.empty().addClass(dd_ctn).addClass(dd_clean);
150
			pa[0] = $e.attr(placeholder) || "请选择日期......";
151
			util.appendChild($e[0], hand);
152
			var $h = $e.children("a");
153
			var $span = $h.children("span");
154
			var date_change = function(val) {
155
				if(val) {
156
					if(val == "current") {
157
						val = date_now().substr(0, 8);
158
					}
159
					var dt = val.substring(0, 4) + "-" + val.substring(4, 6) + "-" + val.substring(6, 8);
160
					if(rv !== val) {
161
						$h.attr("code", val);
162
						$span.text(dt);
163
						rv=val;
164
					}
165
				} else {
166
					rv = "";
167
					$h.attr("code", "");
168
					$span.text("");
169
				}
170
			};
171
			date_change(dv);
172

173
			if(!(cls[readOnly] || cls[showOnly])) {
174
				$e.on("shown.dropdown", function(evt) {
175
					var dp_chs = [];
176
					var n = date_now();
177
					var val = rv ? (date_validDate(rv) ? rv : n) : n;
178
					show_day($e, parseInt(val.substring(0, 4)), parseInt(val.substring(4, 6)) - 1);
179

180
				});
181
				$e.find(".icon-close").on("click", function(evt) {
182
					date_change("");
183
					$e.addClass("dd-hold-once");
184
				});
185
				$e.on("click", ".day .day-item , .day .no-current-month", function() {
186
					date_change(this.getAttribute("day"));
187
				});
188
				$e.on("click", ".day .prev-year", function(e) {
189
					var date_tb = $e.find("table"),
190
						yv = parseInt(date_tb.attr("year")) - 1,
191
						mv = parseInt(date_tb.attr("month")) - 1;
192
					$e.addClass("dd-hold-once");
193
					show_day($e, yv, mv);
194
				});
195
				$e.on("click", ".day .prev-month", function(e) {
196
					var date_tb = $e.find("table"),
197
						yv = parseInt(date_tb.attr("year")),
198
						mv = parseInt(date_tb.attr("month")) - 2;
199
					if(0 > mv) {
200
						yv -= 1;
201
						mv = 11
202
					}
203
					$e.addClass("dd-hold-once");
204
					show_day($e, yv, mv);
205

206
				});
207
				$e.on("click", ".day .next-year", function(e) {
208
					var date_tb = $e.find("table"),
209
						yv = parseInt(date_tb.attr("year")) + 1,
210
						mv = parseInt(date_tb.attr("month")) - 1;
211
					$e.addClass("dd-hold-once");
212
					show_day($e, yv, mv);
213
				});
214
				$e.on("click", ".day .next-month", function(e) {
215
					var date_tb = $e.find("table"),
216
						yv = parseInt(date_tb.attr("year")),
217
						mv = parseInt(date_tb.attr("month"));
218
					if(mv === 12) {
219
						yv += 1;
220
						mv = 0
221
					}
222
					$e.addClass("dd-hold-once");
223
					show_day($e, yv, mv);
224
				});
225
			}
226

227
			return {
228
				name: n,
229
				get: function() {
230
					return rv?rv:undefined;
231
				},
232
				set: function(data) {
233
					change_date(data?data:"");
234
				},
235
				validate: function() {
236
					if(cls[required]) {
237
						if(!rv) {
238
							return "不可为空";
239
						}
240
					}
241
					return util.validate(rules, this);
242
				},
243
				addRules: function(rule) {
244
					util.addRules(rules, rule);
245
				},
246
				reset: function() {
247
					this.set(dv);
248
				},
249
				valid: function() { util.valid($e); },
250
				invalid: function(reson) {
251
					util.invalid($e);
252
					util.error(reson);
253
				}
254
			};
255
		}
256

257
	});
258
});

+ 53 - 43
js/dict.js

@ -1,23 +1,25 @@
1 1
$.define(["jQuery", "util"], "dict", function($, util) {
2
	var cache = {},
2
	var cache = { bool: [{ code: "0", caption: "否", enabled: true }, { code: "1", caption: "是", enabled: true }] },
3 3
		handCache = {},
4 4
		uri = "/ajax/sys/dict/item/",
5 5
		eh = {},
6
		config = { mask: false };
7
		load: function(code) {
6
		config = { mask: false },
7
		set = function(code, items) {
8
			cache[code] = items;
9
			var hs = handCache[code];
10
			if(hs && hs.length) {
11
				hs.forEach(function(h) {
12
					h(items);
13
				});
14
				delete handCache[code];
15
			}
16
		},
17
		load = function(code) {
8 18
			util.get(uri + code, null, function(data) {
9
				cache[code] = data;
10
				var hs = handCache[code];
11
				if(hs && hs.length) {
12
					for(var i = 0; i < hs.length; ++i) {
13
						hs[i](data);
14
					}
15
					delete handCache[code];
16
				}
19
				set(code, data);
17 20
			}, eh, config);
18
		};
19
	return {
20
		apply: function(code, hand) {
21
		},
22
		apply = function(code, hand) {
21 23
			var dict = cache[code];
22 24
			if(!dict) {
23 25
				var hs = handCache[dictCode];
@ -30,7 +32,7 @@ $.define(["jQuery", "util"], "dict", function($, util) {
30 32
				hand(dict);
31 33
			}
32 34
		},
33
		refresh: function(code, hand) {
35
		refresh = function(code, hand) {
34 36
			if(hand) {
35 37
				var hs = handCache[code];
36 38
				if(!hs) {
@ -44,43 +46,34 @@ $.define(["jQuery", "util"], "dict", function($, util) {
44 46
				load(code);
45 47
			}
46 48
		},
47
		getCap: function(items, code) {
49
		getCap = function(items, code) {
48 50
			for(var i = 0; i < items.length; ++i) {
49 51
				var item = items[i];
50 52
				if(code === item.code) {
51 53
					return item.caption;
52 54
				} else if(item.children && item.children.length) {
53
					var ret = get(item.children, code);
55
					var ret = getCap(item.children, code);
54 56
					if(ret) return ret;
55 57
				}
56 58
			}
57 59
			return false;
58 60
		},
59
		get:function(code){
61
		get = function(code) {
60 62
			return cache[code];
61 63
		},
62
		transfer: function($e, dict, code) {
63
			dict = dict || $e.attr("dict");
64
			code = code || $e.attr("code");
65
			if(dict && code) {
66
				this.apply(dict, function(items) {
67
					var cp = get(items, code);
68
					if(cp) {
69
						$e.removeClass("invalid-dict").text(cp);
70
					} else {
71
						$e.addClass("invalid-dict").text("不可翻译的");
72
					}
73
				});
74
			}
75
		},
76
		doTransfer: function() {
77
			$(".hand_dict").each(function() {
78
				var $this = $this;
79
				var dict = $this.attr("dictCode") || $this.attr("dict"),
80
					code = $this.attr("itemCode") || $this.attr("code");
64

65
		ret = {
66
			set: set,
67
			apply: apply,
68
			refresh: refresh,
69
			getCap: getCap,
70
			get: get,
71
			transfer: function($e, dict, code) {
72
				dict = dict || $e.attr("dict") || $e.attr("dictCode");
73
				code = code || $e.attr("code") || $e.attr("itemCode");
81 74
				if(dict && code) {
82
					this.apply(dict, function(items) {
83
						var cp = this.getCap(items, code);
75
					apply(dict, function(items) {
76
						var cp = getCap(items, code);
84 77
						if(cp) {
85 78
							$e.removeClass("invalid-dict").text(cp);
86 79
						} else {
@ -88,8 +81,25 @@ $.define(["jQuery", "util"], "dict", function($, util) {
88 81
						}
89 82
					});
90 83
				}
91
				$this.removeClass("hand_dict");
92
			});
93
		}
94
	};
84
			},
85
			doTransfer: function() {
86
				$(".hand-dict").each(function() {
87
					var $this = $this;
88
					var dict = $this.attr("dict") || $this.attr("dictCode"),
89
						code = $this.attr("code") || $this.attr("itemCode");
90
					if(dict && code) {
91
						apply(dict, function(items) {
92
							var cp = getCap(items, code);
93
							if(cp) {
94
								$e.removeClass("invalid-dict").text(cp);
95
							} else {
96
								$e.addClass("invalid-dict").text("不可翻译的");
97
							}
98
						});
99
					}
100
					$this.removeClass("hand-dict");
101
				});
102
			}
103
		};
104
	return ret;
95 105
});

+ 7 - 6
js/dropdown.js

@ -11,13 +11,14 @@ $.define(["jQuery", "util", "doc"], "dropdown", function($, util, doc) {
11 11
		dd_drop = "dd-drop",
12 12
		q_dd_drop = ".dd-drop",
13 13
		dd_hold = "dd-hold",
14
		dd_hold_once = "dd-hold-once",readOnly="readOnly",showOnly="showOnly",
14
		dd_hold_once = "dd-hold-once",
15
		readOnly = "readOnly",
16
		showOnly = "showOnly",
15 17
		clearMenus = function(e) {
16 18
			if(e && e.which === 3) return
17 19
			$(q_dd_bg).remove();
18 20
			$(q_dd_ctn).each(function() {
19
				var $this = $(this),
20
					cls = util.classCheck(this, [open, dd_hold, dd_hold_once, dd_clean]);
21
				var $this = $(this),cls = util.classCheck(this, [open, dd_hold, dd_hold_once, dd_clean]);
21 22
				relatedTarget = {
22 23
					relatedTarget: this
23 24
				};
@ -39,12 +40,12 @@ $.define(["jQuery", "util", "doc"], "dropdown", function($, util, doc) {
39 40
			var $this = $(this),
40 41
				$ddc = $this.parents(q_dd_ctn);
41 42
			if(!$ddc.length) return;
42
			var cls=util.classCheck($ddc[0],[open,q_readOnly,q_showOnly,dd_hold,dd_hold_once])
43
			var cls = util.classCheck($ddc[0], [open, readOnly, showOnly, dd_hold, dd_hold_once]);
43 44
			clearMenus();
44 45
			if(!cls[open]) {
45 46
				if(cls[readOnly] || cls[showOnly]) return;
46
				if(cls(dd_hold)) return false;
47
				if[cls[dd_hold_once]) {
47
				if(cls[dd_hold]) return false;
48
				if(cls[dd_hold_once]) {
48 49
					$ddc.removeClass(dd_hold_once);
49 50
					return false;
50 51
				}

+ 13 - 5
js/form.js

@ -1,6 +1,7 @@
1 1
$.define(["jQuery", "util"], "form", function($, util) {
2 2
3 3
	var impls = [],
4
		data_key = "jfw_base_form",
4 5
5 6
		/* default impl */
6 7
		di = function(val) {
@ -53,8 +54,8 @@ $.define(["jQuery", "util"], "form", function($, util) {
53 54
						return items[name];
54 55
					},
55 56
					validate: function(vds) {
56
						if(vd(items)){
57
							return util.validate(rules,this);							
57
						if(vd(items)) {
58
							return util.validate(rules, this);
58 59
						}
59 60
						return false;
60 61
					},
@ -86,7 +87,10 @@ $.define(["jQuery", "util"], "form", function($, util) {
86 87
						}
87 88
						var ret = {};
88 89
						for(key in items) {
89
							ret[key] = items[key].get();
90
							var tmp = items[key].get();
91
							if(undefined !== tmp) {
92
								ret[key] = tmp;
93
							}
90 94
						}
91 95
						return ret;
92 96
					},
@ -140,13 +144,17 @@ $.define(["jQuery", "util"], "form", function($, util) {
140 144
				};
141 145
			}
142 146
			return null;
143
		}
147
		};
144 148
149
	$.fn.form = function(val) {
150
		if(this.length && this.length ===1) {
151
			return bf(this);
152
		}
153
	};
145 154
	return {
146 155
		build: bf,
147 156
		register: function(impl) {
148 157
			impls.push(impl)
149 158
		}
150 159
	};
151
152 160
});

+ 74 - 0
js/pageDataGrid.js

@ -0,0 +1,74 @@
1
$.define(["jQuery", "util", "form", "code", "pager"], "pageDataGrid", function($, util, form, code, pager) {
2
	var qf = ".dt-form",
3
		qt = ".dt-tpl",
4
		qp = ".dt-pager",
5
		derr = {},
6
		dajaxCfg = {},
7
		configPageIndex = function(fn, data) {
8
			if(fn && data  && data.data && data.length) {
9
				var b = (data.pageNo - 1) * data.pageSize;
10
				data.data.forEach(function(obj) {
11
					++b;
12
					obj[fn] = b;
13
				});
14
			}
15
		},
16
		build = function($e, options) {
17
			if($e.length && $e.length === 1) {
18
				var config = { e: derr, ajax: dajaxCfg };
19
				var ele = config.ele = $($e[0]);
20
				config.f = form.build(ele.find(qf));
21
				config.c = code.parseCode(ele.find(qt)[0]);
22
				config.p = pager(ele.find(qp));
23
				config.uri = ele.attr("loadUri");
24
				config.pnn = ele.attr("pagerPrefix") ? "_pageNo" : "pageNo";
25
				config.psn = ele.attr("pagerPrefix") ? "_pageSize" : "pageSize";
26
				config.pageSize = parseInt(ele.attr("pageSize") || "1");
27
				config.pageNo = parseInt(ele.attr("pageNo") || "10");
28
				config.pageIndex = ele.attr("pageIndex");
29
				if(options) {
30
					$.extend(config, options);
31
				};
32
				var ret = {
33
					code: config.c;
34
					form: config f;
35
					load: function() {
36
						if(config.f.validate()) {
37
							config.cache = config.f.val();
38
							config.cache[config.pnn] = config.pageNo;
39
							config.cache[config.psn] = config.pageSize;
40
							this.reload();
41
						}
42
					},
43
					reload: function() {
44
						util.get(config.uri, config.cache, function(data) {
45
							configPageIndex(config.pageIndex, data);
46
							config.c.val(data.data);
47
							config.p.paint(data);
48
						}, config.e, config.ajax);
49
					},
50
					error: function(eh) {
51
						config.e = eh;
52
					},
53
					beforeFill: function(h) {
54
						config.c.before(h);
55
					},
56
					ajaxConfig: function(cfg) {
57
						config.ajax = cfg;
58
					}
59
				};
60
				config.p.onGo(function(no) {
61
					config.pageNo = no;
62
					ret.reload();
63
				});
64
				return ret;
65
			};
66
		};
67

68
	$.fn.pdg = function(option) {
69
		if(this.length && this.length === 1) {
70
			return build(this, option);
71
		}
72
	};
73
	return { build: build };
74
});

+ 64 - 0
js/pager.js

@ -0,0 +1,64 @@
1
$.define(["jQuery", "util"], "pager", function($, util) {
2
	var sli = { tn: "li", chs: [{ tn: "a", attrs: [{ an: "href", av: "javascript:;" }], chs: ["..."] }] };
3

4
	function li(clses, dpn, rpn) {
5
		return { tn: "li", attrs: [{ an: "class", av: clses }, { an: "no", av: "" + rpn }], chs: [{ tn: "a", attrs: [{ an: "href", av: "javascript:;" }], chs: ["" + dpn] }] };
6
	}
7

8
	function calc(data) {
9
		var pages = Math.ceil(data.total / data.pageSize),
10
			no = data.pageNo,
11
			i = no - 2,
12
			ret = [],
13
			clses, dpn, rpn;
14

15
		ret.push(li(no > 1 ? "active" ? "disabled", "«", no - 1));
16
		ret.push(li(no === 1 ? "curr" ? "active", "1", 1));
17

18
		if(no > 4) {
19
			ret.push(sli);
20
		}
21
		for(i = Math.max(2, no - 2); i < no; ++i) {
22
			ret.push(li("active", i, i));
23
		}
24
		if(no != 1) {
25
			ret.push(li("curr", no, no));
26
		}
27
		i = no + 1;
28
		var min = Math.min(pages, no + 3);
29
		for(; i < min; ++i) {
30
			ret.push(li("active", i, i));
31
		}
32
		if(pages - no > 3) {
33
			ret.push(sli);
34
		}
35
		if(pages != no) {
36
			ret.push(li("active", pages, pages));
37
		}
38
		ret.push(li(no != pages ? "active" ? "disabled", "»", no + 1));
39
		return ret;
40

41
	}
42

43
	return function($e) {
44
		var e = $e,
45
			h = util.noop;
46
		e.empty();
47
		return {
48
			paint: function(data) {
49
				e.empty();
50
				if(data.total) {
51
					util.appendChild(e[0], calc(data));
52
					e.children("li.active").on("click", function() {
53
						h(parseInt($(this).attr("no")));
54
					});
55
				}
56
			},
57
			onGo: function(goh) {
58
				if(goh) {
59
					h = goh;
60
				}
61
			}
62
		};
63
	};
64
});

+ 222 - 68
js/select.js

@ -2,6 +2,7 @@ $.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, d
2 2
	var readOnly = "readOnly",
3 3
		showOnly = "showOnly",
4 4
		modelName = 'select',
5
		mModelName = "mselect",
5 6
		tInt = "int",
6 7
		tBool = "bool",
7 8
		tString = "string",
@ -15,18 +16,22 @@ $.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, d
15 16
		spanDictCode = { an: "dictCode", av: "" },
16 17
		pa = [""],
17 18
		jhref = { an: "href", av: "javascript:;" },
19
		dd_hand = { an: "class", av: "dd-hand" },
20
		icon_drop = { tn: "i", attrs: [{ an: "class", av: "icon icon-drop" }] },
21
		icon_close = { tn: "i", attrs: [{ an: "class", av: "icon icon-close" }] },
22
		a_placeHolder = { tn: "a", attrs: [jhref, { an: "class", av: placeholder }], chs: pa },
18 23
		hand = {
19 24
			tn: "a",
20 25
			attrs: [
21
				{ an: "class", av: "dd-hand" },
26
				dd_hand,
22 27
				jhref,
23 28
				handCode,
24 29
			],
25 30
			chs: [
26
				{ tn: "i", attrs: [{ an: "class", av: "icon icon-drop" }] },
31
				icon_drop,
27 32
				{ tn: "span", attrs: [spanCode, spanDictCode] },
28
				{ tn: "i", attrs: [{ an: "class", av: "icon icon-close" }] },
29
				{ tn: "a", attrs: [jhref, { an: "class", av: placeholder }], chs: pa }
33
				icon_close,
34
				a_placeHolder,
30 35
			]
31 36
		},
32 37
		seim = { an: "class", av: "select-item" },
@ -34,33 +39,34 @@ $.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, d
34 39
		buildTreeDrop = function(isQueried, items, pa) {
35 40
			items.forEach(function(item) {
36 41
				if(isQueried || item.enabled) {
37
					var li = { tn: "li", attrs: [], chs: [] };
42
					var li = {
43
						tn: "li",
44
						attrs: [{ an: "code", av: item.code }, { an: "caption", av: item.caption }],
45
						chs: []
46
					};
38 47
					if(item.children && item.children.length) {
39
						var bhand = { tn: "a", attrs: [], chs: [] };
40
						bhand.attrs.push({ an: "code", av: item.code });
41
						bhand.chs.push({ tn: "span", chs: [item.caption] });
48
						var bhand = {
49
							tn: "a",
50
							attrs: [{ an: "code", av: item.code }],
51
							chs: [{ tn: "span", chs: [item.caption] }]
52
						};
42 53
						li.attrs.push(sebi);
43 54
						li.chs.push(bhand);
44
						buildTreeDrop(isQueried, item.children, li.chs);
55
						var ul={tn:"ul",chs:[]};
56
						li.chs.push(ul);
57
						buildTreeDrop(isQueried, item.children, ul.chs);
45 58
					} else {
46 59
						li.attrs.push(seim);
47
						li.attrs.push({ an: "code", av: item.code });
48 60
						li.chs.push(item.caption);
49 61
					}
50 62
					pa.push(li);
51 63
				}
52 64
			});
53 65
		},
54
		//			}
55
		//			$ul.find(QF_SELECT_ITEM).on("click.jr_select_api", select_selectItem);
56
		//			$ul.find(QF_BRANCH_ITEM).on("click.jr_select_api", select_branchItem);
57
		//			return $ul;
58
		//	}
59

60
		singleShown = function($e, dictCode, clss, $h, $span) {
66
		buildShown = function($e, dictCode, clss) {
61 67
			return clss[tree] ? function(evt) {
62 68
				var items = dict.get(dictCode);
63
				var drop = { tn: "div", attrs[{ an: "class", av: "dd-drop" }], chs = [] };
69
				var drop = { tn: "div", attrs: [{ an: "class", av: "dd-drop" }], chs: [] };
64 70
				if(items) {
65 71
					var ul = { tn: "ul", chs: [] };
66 72
					buildTreeDrop(clss[queried], items, ul.chs);
@ -69,27 +75,18 @@ $.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, d
69 75
					drop.chs.push("loading.........");
70 76
				}
71 77
				util.appendChild($e[0], drop);
72
				if(items) {
73
					$e.find(".select-item").on("click", function() {
74
						var cc = this.getAttribute("code");
75
						$h.attr("code", cc);
76
						$span.attr("code", cc);
77
						$span[0].textContent = this.textContent;
78

79
					});
80
					$e.find(".branch-item").on("click", function(evt) {
81
						$(this).toggleClass("open");
82
						$e.addClass("dd-hold-once");
83
					});
84
				}
85 78
			} : function(evt) {
86 79
				var items = dict.get(dictCode);
87
				var drop = { tn: "div", attrs[{ an: "class", av: "dd-drop" }], chs = [] };
80
				var drop = { tn: "div", attrs: [{ an: "class", av: "dd-drop" }], chs: [] };
88 81
				if(items) {
89 82
					var ul = { tn: "ul", chs: [] };
90 83
					items.forEach(function(item) {
91 84
						if(clss[queried] || item.enabled) {
92
							this.push({ tn: "li", attr[seim, { an: "code": av: item.code }], chs: [item.caption] });
85
							this.push({
86
								tn: "li",
87
								attrs: [seim, { an: "code", av: item.code }, { an: "caption", av: item.caption }],
88
								chs: [item.caption]
89
							});
93 90
						}
94 91
					}, ul.chs);
95 92
					drop.chs.push(ul);
@ -97,72 +94,81 @@ $.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, d
97 94
					drop.chs.push("loading.........");
98 95
				}
99 96
				util.appendChild($e[0], drop);
100
				if(items) $e.find(".select-item").on("click", function(e) {
101
					var cc = this.getAttribute("code");
102
					$h.attr("code", cc);
103
					$span.attr("code", cc);
104
					$span[0].textContent = this.textContent;
105
				});
106 97
			};
107 98
		};
108 99

109
	from.register(function($e) {
110
		var cls = util.classCheck($e[0], [readOnly, showOnly, modelName, tInt, tBool, required, tree, queried]);
100
	form.register(function($e) {
101
		var cls = util.classCheck($e[0], [readOnly, showOnly, modelName, tInt, tBool, required, tree, queried]),
102
			rv;
111 103
		if(cls[modelName]) {
112
			var n = attr("name") || $e.attr("id"),
104
			var n = $e.attr("name") || $e.attr("id"),
113 105
				ve, rules = [];
114 106
			if(!n) {
115 107
				throw "Attribute[name] is invalid";
116 108
			}
117 109
			var dv = $e.attr(def) || "",
118 110
				dictCode = $e.attr("dictCode") || "";
111
			rv = dv;
119 112
			if(!dictCode) { throw "Attribute[dictCode] is invalid"; }
120 113
			$e.empty().addClass("dd-ctn").addClass("dd-clean");
121 114
			handCode.av = spanCode.av = dv;
122 115
			spanDictCode.av = dictCode;
123
			pa[0] = $e.attr(placeholder) || "";
116
			pa[0] = $e.attr(placeholder) || "请选择......";
124 117
			util.appendChild($e[0], hand);
125 118
			var $h = $e.children("a");
126 119
			var $span = $h.children("span");
120
			var select_change = function(nv, cap, evt) {
121
				if(rv != nv) {
122
					rv = nv;
123
					$h.attr("code", rv);
124
					$span.attr("code", rv).text(cap).removeClass("invalid-dict");
125
					if(evt) {
126
						$e.addClass("dd-hold-once");
127
					}
128
				}
129
			};
127 130
			if(!(cls[readOnly] || cls[showOnly])) {
128
				$e.on("shown", singleShown($e[0], dictCode, cls, $h, $span));
129
				$e.find(".icon-close").on("click", function() {
130
					$e.addClass("dd-hold-once");
131
					$h.attr("code", "");
132
					$span.attr("code", "").text("");
131
				$e.on("shown.dropdown", buildShown($e, dictCode, cls));
132
				$e.find(".icon-close").on("click", function(evt) {
133
					select_change("", "", evt);
134
				});
135
				$e.on("click", "div .select-item", function() {
136
					select_change(this.getAttribute("code"), this.getAttribute("caption"));
133 137
				});
138
				if(cls[tree]) {
139
					$e.on("click", "div .branch-item>a", function(evt) {
140
						$(this).toggleClass("open");
141
						$e.addClass("dd-hold-once");
142
					});
143
				}
134 144
			}
135
			if(dv) {
136
				dict.tranfer($span, dictCode, dv);
145
			if(rv) {
146
				dict.transfer($span, dictCode, rv);
137 147
			} else {
138 148
				dict.apply(dictCode, util.noop);
139 149
			}
140 150
			return {
141 151
				name: n,
142 152
				get: function() {
143
					var vd = $h.attr("code");
144
					if(vd) {
145
						return css[tBool]?'1'===vd:cls[tInt]?parseInt(vd):vd;
153
					if((!cls[showOnly]) && rv) {
154
						return cls[tBool] ? '1' === rv : cls[tInt] ? parseInt(rv) : rv;
146 155
					}
147 156
				},
148 157
				set: function(data) {
149
					if(data){
150
						var cc = data===true?"1":(""+data);
151
						$h.attr("code",cc);
152
						$span.attr("code",cc);
153
						dict.transfer($span,dictCode,cc);
154
					}else if(data===false || data==0){
155
						$h.attr("code",'0');
156
						$span.attr("code",'0');
157
						dict.transfer($span,dictCode,'0');
158
					}else{
159
						$h.attr("code",'');
160
						$span.attr("code",'').text("");
158
					if(data) {
159
						var cc = data === true ? "1" : ("" + data);
160
						select_change(cc, "");
161
						dict.transfer($span, dictCode, cc);
162
					} else if(data === false || data === 0) {
163
						select_change("0", "");
164
						dict.transfer($span, dictCode, cc);
165
					} else {
166
						select_change("", "");
161 167
					}
162 168
				},
163 169
				validate: function() {
164
					if(cls[required]){
165
						if(!$h.attr("code")){
170
					if(cls[required]) {
171
						if(!rv) {
166 172
							return "不可为空";
167 173
						}
168 174
					}
@ -170,7 +176,156 @@ $.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, d
170 176
				},
171 177
				addRules: function(rule) {
172 178
					util.addRules(rules, rule);
179
				},
180
				reset: function() {
181
					this.set(dv);
182
				},
183
				valid: function() { util.valid($e); },
184
				invalid: function(reson) {
185
					util.invalid($e);
186
					util.error(reson);
173 187
				}
188
			};
189
		}
190

191
	});
192
	var selCap={an:"class",av:"select-caption"}, mhand = {
193
		tn: "a",
194
		attrs: [dd_hand],
195
		chs: [icon_drop, { tn: "ul" }, a_placeHolder]
196
	};
197
	form.register(function($e) {
198
		var cls = util.classCheck($e[0], [readOnly, showOnly, mModelName, tInt, required, tree, queried]);
199
		if(cls[mModelName]) {
200
			var n = $e.attr("name") || $e.attr("id"),
201
				rules = [];
202
			if(!n) {
203
				throw "Attribute[name] is invalid";
204
			}
205
			var dv = [],
206
				rv = [],
207
				tmp = ($e.attr(def) || "").split(","),
208
				dictCode = $e.attr("dictCode") || "";
209
			if(!dictCode) { throw "Attribute[dictCode] is invalid"; }
210
			tmp.forEach(function(item) {
211
				if(item) {
212
					item = item.trim();
213
					if(item) {
214
						dv.push(item);
215
						rv.push(item);
216
					}
217
				}
218
			});
219
			$e.empty().addClass("dd-ctn").addClass("dd-clean");
220
			pa[0] = $e.attr(placeholder) || "请选择......";
221
			var lis = mhand.chs[1].chs = [];
222
			dv.forEach(function(item) {
223
				lis.push({
224
					tn: "li",
225
					attrs: [{ an: "code", av: item }],
226
					chs: [icon_close, { tn: "span", attrs: [{ an: "code", av: item},selCap] }]
227
				});
228
			});
229
			util.appendChild($e[0], mhand);
230

231
			var $ul = $e.find("ul");
232
			var mselect_add = function(nv, cp) {
233
				if(rv.indexOf(nv) > -1) {
234
					return false;
235
				}
236
				rv.push(nv);
237
				var li = {
238
					tn: "li",
239
					attrs: [{ an: "code", av: nv }],
240
					chs: [icon_close,
241
						{
242
							tn: "span",
243
							attrs: [{ an: "code", av: nv },selCap],
244
							chs: [cp]
245
						}
246
					]
247
				};
248
				util.appendChild($ul[0], li);
249
				return true;
250
			};
251
			var mselect_change = function(na) {
252
				rv = [], nlis = [];
253
				$ul.empty();
254
				na.forEach(function(item) {
255
					rv.push("" + item);
256
				});
257
				if(rv.length) {
258
					rv.forEach(function(item) {
259
						nlis.push({
260
							tn: "li",
261
							attrs: [{ an: "code", av: nv },selCap],
262
							chs: [icon_close, {
263
								tn: "span",
264
								attrs: [{ an: "code", av: item.code }, { an: "dict", av: dictCode }, { an: "class", av: "hand-dict" }],
265
								chs: [cp]
266
							}]
267
						});
268
					});
269
					util.appendChild($ul[0], nlis);
270
					dict.doTransfer();
271
				}
272
			};
273
			if(lis.length) {
274
				$ul.find("span").each(function() {
275
					dict.transfer($(this), dictCode);
276
				});
277
			} else {
278
				dict.apply(dictCode, util.noop);
279
			}
280

281
			if(!(cls[readOnly] || cls[showOnly])) {
282
				$e.on("shown.dropdown", buildShown($e, dictCode, cls));
283
				$ul.on("click", "li>i", function(e) {
284
					$e.addClass("dd-hold-one");
285
					var idx = rv.indexOf(this.parentNode.getAttribute("code"));
286
					if(idx > -1) {
287
						rv.splice(idx, 1);
288
					}
289
					$(this).parent().remove();
290
				});
291
				$e.on("click", "div .select-item", function() {
292
					if(!mselect_add(this.getAttribute("code"), this.getAttribute("caption"))) {
293
						$e.addClass("dd-hold-once");
294
					}
295
				});
296
				if(cls[tree]) {
297
					$e.on("click", "div .branch-item>a", function(evt) {
298
						$(this).toggleClass("open");
299
						$e.addClass("dd-hold-once");
300
					});
301
				}
302
			}
303

304
			return {
305
				name: n,
306
				get: function() {
307
					if((!cls[showOnly]) && rv.length) {
308
						var ret = [];
309
						rv.forEach(function(item) {
310
							ret.push(cls[tInt] ? parseInt(item) : item);
311
						});
312
						return ret;
313
					}
314
				},
315
				set: function(data) {
316
					mselect_change(data ? (data.length ? data : []) : []);
317
				},
318
				validate: function() {
319
					if(cls[required]) {
320
						if(!rv.length) {
321
							return "不可为空";
322
						}
323
					}
324
					return util.validate(rules, this);
325
				},
326
				addRules: function(rule) {
327
					util.addRules(rules, rule);
328
				},
174 329
				reset: function(data) {
175 330
					this.set(dv);
176 331
				},
@ -181,6 +336,5 @@ $.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, d
181 336
				}
182 337
			};
183 338
		}
184

185 339
	});
186 340
});

+ 410 - 0
js/spa.js

@ -0,0 +1,410 @@
1
$.define(["jQuery", "util", "doc", "win", "body"], "spa", function($, util, doc, win, body) {
2
	var head = doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement,
3
		baseElement = head.getElementsByTagName("base")[0],
4
		ahref = { an: "href", av: "javascript:;" },
5
		spa_modal_index = 0,
6
		spa_css_ref = 0,
7
		resCache = {},
8
		cssCache = {},
9
		htmlCache = { "#": "#" },
10
		modelCache = {},
11
		scriptCache {}, resUri, menuUri, menuEle,
12
		main, mainEle,
13
		errHand = {
14
			"defErrHand": function(err) {
15
				showModal("_def_err_form", err);
16
			}
17
		},
18
		cfg = {
19
			error: errHand,
20
			ajaxCfg: { mask: true },
21
			mask: true,
22
			loadEnabled: true
23
		},
24
		load_res = function() {
25
			if(resUri) {
26
				util.get(resUri, null, function(data) {
27
					/**
28
					 * res =[{id:"",uri:"",css:"",script:""},{id:"",uri:"",css:"",script:""},...........]
29
					 */
30
					if(data && data.length) {
31
						data.forEach(function(item) {
32
							resCache[item.id] = item;
33
						});
34
					}
35
					menuUri ? load_menu() : showMain();
36
				}, cfg.error, cfg.ajaxCfg);
37
			}
38
		},
39
		load_menu = function() {
40
			util.get(menuUri, null, function(menu) {
41
				build_menu(menu);
42
				showMain();
43
			}, cfg.error, cfg.ajaxCfg);
44
		},
45
		build_menu = function(menu) {
46
			if(menuEle && emnuEle.length && menu && menu.length) {
47
				var ul = { tn: "ul", attrs: [{ an: "class", av: "nav nav-root" }], chs: [] };
48
				build_menu_item(ul.chs, menu);
49
				menuEle.empty();
50
				util.appendChild(menuEle[0], ul);
51
				menuEle.find(".nav-hand").on("click", function(e) {
52
					var $this = $(this);
53
					menuEle.find(".nav-hand.active").removeClass("active");
54
					$this.addClass("active");
55
					if($this.hasClass("spa-modal")) {
56
						showModal($this.attr("res"));
57
					} else {
58
						location.hash = "#" + $this.attr("res");
59
						showMain();
60
					}
61
				});
62
				menuEle.find(".nav-branch-hand").on("click", function(e) {
63
					var prt = $(this).parent();
64
					if(prt.hasClass("open")) {
65
						prt.removeClass("open");
66
					} else {
67
						prt.parent().children(".open").removeClass("open");
68
						prt.addClass("open");
69
					}
70
				});
71
			}
72
		},
73
		build_menu_item = function(po, items) {
74
			var item, res, caption, iconClass;
75
			items.forEach(function(item) {
76
				var li = { tn: "li" },
77
					attrs = li.attrs = [],
78
					chses = li.chs = [],
79
					lia = { tn: "a", attrs: [ahref], chs: [] };
80
				chses.push(lia);
81
				var ic = "icon-" + (item.icon || (item.res ? "book" : "branch"));
82
				lia.chs.push({ tn: "i", attrs: [{ an: "class", av: ic }] });
83
				lia.push(item.caption);
84
				var lac = "";
85
				if(item.res) {
86
					lia.attrs.push({ an: "res", av: item.res });
87
					lac = lac + (item.modal ? " nav-hand spa-modal" : " nav-hand");
88
					lia.attrs.push({ an: "class", av: lac })
89
				} else {
90
					lia.chs.push({ tn: "i", attrs: [{ an: "class", av: "icon fold" }] });
91
					lac = lac + " nav-branch-hand";
92
					attrs.push({ an: "class", av: "nav-parent" });
93
					var ul = { tn: "ul", attrs: [{ an: "class", av: "nav" }], chs: [] };
94
					chses.push(ul);
95
					build_menu_item(ul, item.children);
96
				}
97
				lia.attrs.push({ an: "class", av: lac });
98
				po.push(li);
99
			});
100
		},
101
		loadModelCss = function(model) {
102
			if(model.css) {
103
				var uri = model.css;
104
				if(cssCache[uri]) {
105
					cssCache[uri]['ref'] = cssCache[uri]['ref'] + 1;
106
				} else {
107
					++spa_css_ref;
108
					var css_id = "___spa_css_id_" + spa_css_ref;
109
					cssCache[uri] = { ref: 1, id: css_id };
110
					var link = doc.createElement('link');
111
					link.rel = 'stylesheet';
112
					link.href = model.css;
113
					link.media = 'all';
114
					link.setAttribute("id", css_id);
115
					head.appendChild(link);
116
				}
117
			}
118
		},
119
		showMainInternal = function(model) {
120
			cleanMain();
121
			main = model;
122
			loadModelCss(model);
123
			if(model.uri) {
124
				mainEle.html(htmlCache[model.uri]);
125
			}
126
			mainEle.attr("spa-model-id", model.id);
127
			if(model.factory && model.factory.main) {
128
				model.factory.main.call();
129
			}
130
		},
131
		showModalInternal = function(model, data) {
132
			loadModelCss(model);
133
			var ly = util.showModal(model.uri ? htmlCache[model.uri] : null);
134
			++spa_modal_index;
135
			ly.ctn.addClass("spa-modal").addClass("spa-modal-index-" + spa_modal_index).attr("spa-model-id", model.id);
136
			if(model.factory && model.factory.modal) {
137
				model.factory.modal(data);
138
			}
139
		},
140
		cacheModel = function(model) {
141
			var m = modelCache[model.id] = {};
142
			m.uri = model.uri;
143
			m.factory = model.factory;
144
			m.css = model.css;
145
			m.id = model.id;
146
			m.data = model.data;
147
			delete resCache[model.id];
148
			return m;
149
		},
150
		afterLoadByMain = function(model, data) {
151
			showMainInternal(cacheModel(model));
152
		},
153
		afterLoadByModal = function(model, data) {
154
			showModalInternal(cacheModel(model), data);
155
		},
156
		loadModel = function(model, handler, data) {
157
			if(htmlCache[model.uri || "#"]) {
158
				model.state = 11;
159
				if(model.script) {
160
					loadModelScript(model, handler, data);
161
				} else {
162
					handler(model, data);
163
				}
164
			} else {
165
				if(cfg.mask) {
166
					util.showLoading();
167
				}
168
				model.state = 10;
169
				$.ajax({ url: model.uri, dataType: "html", type: "GET" }).done(function(hc) {
170
					model.state = 11;
171
					htmlCache[model.uri] = hc;
172
					if(cfg.mask) {
173
						util.hideLoading();
174
					}
175
					if(model.script) {
176
						loadModelScript(model, handler, data);
177
					} else {
178
						handler(model, data);
179
					}
180
				}).fail(function(jqXHR, textStatus, errorThrown) {
181
					model.state = 12;
182
					if(cfg.mask) { util.hideLoading(); }
183
					cfg.error({
184
						code: "loadModelHtml_" + (textStatus || ""),
185
						msg: textStatus,
186
						detailMsg: textStatus,
187
						xhr: jqXHR,
188
						eObj: errorThrown,
189
						url: model.uri
190
					});
191
				});
192
			}
193
		},
194
		removeModelCss = function(model) {
195
			if(model.css) {
196
				var cm = cssCache[model.css];
197
				if(cm) {
198
					cm.ref = cm.ref - 1;
199
					if(!cm.ref) {
200
						var link = doc.getElementById(cm.id);
201
						if(link) link.parentNode.removeChild(link);
202
						delete cssCache[model.css];
203
					}
204
				}
205
			}
206
		},
207
		loadModelScript = function(model, handler, data) {
208
			model.factory = scriptCache[model.script];
209
			if(model.factory) {
210
				model.state = 31;
211
				handler.call(model, data);
212
				return;
213
			}
214
			var node = doc.createElement("script");
215
			node.async = true;
216
			node.src = model.script;
217
			node.charset = "UTF-8";
218
			var supportOnload = "onload" in node;
219
			if(cfg.mask) {
220
				util.showLoading();
221
			}
222
			window.spa_define = function(factoryBuilder) {
223
				model.state = 30;
224
				if(cfg.mask) {
225
					util.showLoading();
226
				}
227
				try {
228
					scriptCache[model.script] = model.factory = factoryBuilder();
229
					model.state = 31;
230
					if(cfg.mask) {
231
						util.hideLoading();
232
					}
233
				} catch(err) {
234
					model.state = 32;
235
					if(cfg.mask) {
236
						util.hideLoading();
237
					}
238
					cfg.error({
239
						code: "buildModelFactory_" + err.toString(),
240
						msg: err.toString() || "",
241
						detailMsg: err.toString() || "",
242
						url: model.script
243
					});
244
				}
245
				handler(model, data);
246
			};
247

248
			if(supportOnload) {
249
				node.onload = function() {
250
					if(model.state < 21) model.state = 21;
251
					node.onerror = null;
252
					node.onload = null;
253
					head.removeChild(node);
254
					if(cfg.mask) {
255
						util.hideLoading();
256
					}
257
				};
258
				node.onerror = function() {
259
					node.onload = null;
260
					node.onerror = null;
261
					head.removeChild(node);
262
					if(cfg.mask) {
263
						util.hideLoading();
264
					}
265
					if(model.state < 22) {
266
						model.state = 22;
267
						cfg.error({
268
							code: "loadModelScript_" + err.toString(),
269
							msg: err.toString() || "",
270
							detailMsg: err.toString() || "",
271
							url: model.script
272
						});
273
					}
274
				};
275
			} else {
276
				node.onreadystatechange = function() {
277
					if(/loaded|complete/.test(node.readyState)) {
278
						node.onreadystatechange = null;
279
						if(model.state < 21) {
280
							model.state = 21;
281
							var to = model.timeout || 1000;
282
							setTimeout(function() {
283
								if(model.state == 21) {
284
									model.state = 22;
285
									head.removeChild(node);
286
									if(cfg.mask) {
287
										util.hideLoading();
288
									}
289
									cfg.error({
290
										code: "loadModelScript_timeout",
291
										msg: "",
292
										detailMsg: "",
293
										url: model.script
294
									});
295
								}
296
							}, model.timeout || 1000);
297
						} else {
298
							head.removeChild(node);
299
							if(cfg.mask) {
300
								util.hideLoading();
301
							}
302
						}
303
					}
304
				};
305
			}
306
			model.state = 20;
307
			baseElement ?
308
				head.insertBefore(node, baseElement) :
309
				head.appendChild(node);
310
		},
311
		cleanMain = function() {
312
			if(main) {
313
				removeModelCss(main);
314
				if(main.factory && main.factory.mainDestory) { main.factory.mainDestory() };
315
				mainEle.empty();
316
				main = null;
317
			}
318
		},
319
		getModel = function(id) {
320
			return modelCache[id];
321
		},
322
		showModal = function(id, data) {
323
			var model = modelCache[id];
324
			if(model) {
325
				showModalInternal(model, data);
326
			} else {
327
				model = resCache[id];
328
				if(model) {
329
					loadModel(model, afterLoadByModal, data);
330
				} else {
331
					cfg.error({ code: "invalid_model", msg: "不正确的模块[" + id + "]", detailMsg: "不正确的模块[" + id + "]" });
332
				}
333
			}
334
		},
335
		showMain = function() {
336
			var id = win.location.hash;
337
			if(id && id.length > 1) {
338
				id = id.substring(1);
339
			} else return;
340
			if(main && id == main.id) return;
341
			if(main) {
342
				cleanMain();
343
			}
344
			var model = modelCache[id];
345

346
			if(model) {
347
				showMainInternal(model);
348
			} else {
349
				var model = resCache[id];
350
				if(model) {
351
					loadModel(model, afterLoadByMain);
352
				} else {
353
					cfg.error({ code: "invalid_model", msg: "不正确的模块[" + id + "]", detailMsg: "不正确的模块[" + id + "]" });
354
				}
355
			}
356
		},
357
		getLastModalIndex = function() {
358
			return spa_modal_index;
359
		},
360
		getLastModalCtn = function() {
361
			return $(".spa-modal-index-" + spa_modal_index);
362
		},
363
		getLastModalModel = function() {
364
			var ctn = $(".spa-modal-index-" + spa_modal_index);
365
			var id = modalCtn.attr("spa-model-id");
366
			return getModel(id);
367
		},
368
		closeModal = function() {
369
			var ctn = $(".spa-modal-index-" + spa_modal_index);
370
			var id = ctn.attr("spa-model-id");
371
			var inx = util.listModalIndex();
372
			if(ctn.hasClass("layer-" + inx)) {
373
				var model = modelCache[id];
374
				if(model) {
375
					if(model.factory.modalDestory) {
376
						model.factory.modalDestory.call(this);
377
					}
378
					if(model.css) {
379
						removeModelCss(model);
380
					}
381
					--spa_modal_index;
382
					util.closeModal();
383
				}
384
			} else {
385
				cfg.error({ code: "invalid_dir", msg: "can't close modal:has top layer", detailMsg: "can't close modal:has top layer" });
386
			}
387
		},
388
		build = function(config) {
389
			$.extend(cfg, config);
390
			resUri = cfg.resUri || body.attr("resUri");
391
			menuUri = cfg.resUri || body.attr("menuUri");
392
			mainEle = cfg.mainEle || $(".spa-main");
393
			menuEle = cfg.menuEle || $(".spa-menu");
394
			resCache = cfg.resCache || resCache;
395
			htmlCache = cfg.htmlCache || htmlCache;
396
			htmlCache["#"] = "#";
397
			if(cfg.loadEnabled) load_res();
398
		},
399
		ret = {
400
			build: build,
401
			closeModal: closeModal,
402
			getLastModalModel: getLastModalModel,
403
			getLastModalCtn: getLastModalCtn,
404
			getLastModalIndex: getLastModalIndex,
405
			showMain: showMain,
406
			showModal: showModal
407
		};
408
		$.spa=ret;
409
	return ret;
410
});

+ 42 - 15
js/text.js

@ -1,9 +1,21 @@
1
$.define(["jQuery", "form", "util"],"text",function($, form, util) {
2
	var trim="trim",readOnly="readOnly",showOnly="showOnly",modelName='text',tInt="int",tBool="bool",tFloat="float",tString="string",pw="password",def="defVal",placeholder="placeholder",required="required";	
3
	from.register(function($e) {
4
		var cls = util.classCheck($e[0],[modelName,trim,readOnly,showOnly,tInt,tBool,tFloat,pw,]);
1
$.use(["jQuery", "form", "util"], function($, form, util) {
2
	var trim = "trim",
3
		readOnly = "readOnly",
4
		showOnly = "showOnly",
5
		modelName = 'text',
6
		tInt = "int",
7
		tBool = "bool",
8
		tFloat = "float",
9
		tString = "string",
10
		pw = "password",
11
		def = "defVal",
12
		placeholder = "placeholder",
13
		required = "required";
14
	form.register(function($e) {
15
		var cls = util.classCheck($e[0], [modelName, trim, readOnly, showOnly, tInt, tBool, tFloat, pw, ]);
5 16
		if(cls[modelName]) {
6
			var n = $e.attr("name") || $e.attr("id"),ve, rules = [];
17
			var n = $e.attr("name") || $e.attr("id"),
18
				ve, rules = [];
7 19
			if(!n) {
8 20
				throw "Attribute[name] is invalid";
9 21
			}
@ -12,26 +24,41 @@ $.define(["jQuery", "form", "util"],"text",function($, form, util) {
12 24
			if(cls[showOnly]) {
13 25
				$e.text(dv);
14 26
			} else {
15
				ve = $("<input type='" + (cls[pw] ? pw :modelName) + "' />");
16
				var tmp = this.ele.attr(placeholder);
27
				ve = $("<input type='" + (cls[pw] ? pw : modelName) + "' />");
28
				var tmp = $e.attr(placeholder);
17 29
				if(tmp) ve.attr(placeholder, tmp);
18 30
				if(cls[readOnly]) ve.prop('readonly', "readonly");
31
				ve.val(dv);
19 32
				ve.appendTo($e);
20 33
			}
21 34
			return {
22 35
				name: n,
23 36
				get: function() {
24
					var vd = ve.val();
25
					if(vd) {
26
						return   cls[tInt] ? parseInt(vd):cls[tFloat]? parseFloat(vd):vd;
37
					if(!cls[showOnly]) {
38
						var vd = ve.val();
39
						if(vd) {
40
							if(cls[tInt]) {
41
								vd = parseInt(vd);
42
								if(!isNaN(vd)) { return vd };
43
							} else if(cls[tFloat]) {
44
								vd = parseFloat(vd);
45
								if(!isNaN(vd)) { return vd };
46
							} else {
47
								return vd;
48
							}
49
						}
27 50
					}
28 51
				},
29 52
				set: function(data) {
30
					if(cls[showOnly) $e.text(data) else ve.val(data);
53
					if(cls[showOnly]) {
54
						$e.text(data)
55
					} else {
56
						ve.val(data);
57
					}
31 58
				},
32 59
				validate: function() {
33
					if(cls[required]){
34
						if(!ve.val()){
60
					if(cls[required]) {
61
						if(!ve.val()) {
35 62
							return "不可为空或空字符串";
36 63
						}
37 64
					}
@ -39,8 +66,8 @@ $.define(["jQuery", "form", "util"],"text",function($, form, util) {
39 66
				},
40 67
				addRules: function(rule) {
41 68
					util.addRules(rules, rule);
42
				}
43
				reset: function(data) {
69
				},
70
				reset: function() {
44 71
					this.set(dv);
45 72
				},
46 73
				valid: function() { util.valid($e); },

+ 70 - 0
js/textarea.js

@ -0,0 +1,70 @@
1
$.use(["jQuery", "form", "util"], function($, form, util) {
2
	var trim = "trim",
3
		readOnly = "readOnly",
4
		showOnly = "showOnly",
5
		modelName = 'textarea',
6
		def = "defVal",
7
		placeholder = "placeholder",
8
		required = "required";
9
	form.register(function($e) {
10
		var cls = util.classCheck($e[0], [modelName, trim, readOnly, showOnly]);
11
		if(cls[modelName]) {
12
			var n = $e.attr("name") || $e.attr("id"),
13
				ve, rules = [];
14
			if(!n) {
15
				throw "Attribute[name] is invalid";
16
			}
17
			dv = $e.attr(def) || "";
18
			$e.empty();
19
			if(cls[showOnly]) {
20
				$e.text(dv);
21
			} else {
22
				ve = $("<textarea></textarea>");
23
				ve.attr("rows", $e.attr("rows") || "3");
24
				ve.attr("cols", $e.attr("cols") || "20");
25
				var tmp = $e.attr(placeholder);
26
				if(tmp) ve.attr(placeholder, tmp);
27
				if(cls[readOnly]) ve.prop("readonly", "readonly");
28
				ve.val(dv);
29
				ve.appendTo($e);
30
			}
31
			return {
32
				name: n,
33
				get: function() {
34
					if(!cls[showOnly]) {
35
						var vd = ve.val();
36
						return vd?(cls[trim]?vd.trim():vd):undefined;
37
					}
38
				},
39
				set: function(data) {
40
					if(cls[showOnly]) {
41
						$e.text(data)
42
					} else {
43
						ve.val(data);
44
					}
45
				},
46
				validate: function() {
47
					if(cls[required]) {
48
						var v=cls[trim]?ve.val().trim():ve.val();
49
						if(!v) {
50
							return "不可为空或空字符串";
51
						}
52
					}
53
					return util.validate(rules, this);
54
				},
55
				addRules: function(rule) {
56
					util.addRules(rules, rule);
57
				},
58
				reset: function() {
59
					this.set(dv);
60
				},
61
				valid: function() { util.valid($e); },
62
				invalid: function(reson) {
63
					util.invalid($e);
64
					util.error(reson);
65
				}
66
			};
67
		}
68

69
	});
70
});

+ 17 - 11
js/util.js

@ -1,4 +1,4 @@
1
$.define(["jQuery", "body", "win"], "util", function($, $body, win) {
1
$.define(["jQuery", "body", "win","doc"], "util", function($, $body, win,doc) {
2 2
	var rclass = /[\t\r\n\f]/g,
3 3
		noop = function() {},
4 4
		infoDiv = $("#g_info"),
@ -16,7 +16,7 @@ $.define(["jQuery", "body", "win"], "util", function($, $body, win) {
16 16
			this.ctn.empty();
17 17
			this.ctn.remove();
18 18
			this.prev.css("display", "block");
19
			_g_layer_curr = this.prev;
19
			layer_curr = this.prev;
20 20
		},
21 21
		fh = function(e) {
22 22
			$(this).parent().hide();
@ -36,11 +36,11 @@ $.define(["jQuery", "body", "win"], "util", function($, $body, win) {
36 36
			}
37 37
		},
38 38
		modal = function(ctn) {
39
			var inx = _g_layer_curr.index + 2,
39
			var inx = layer_curr.index + 2,
40 40
				ly = {
41 41
					index: inx,
42 42
					remove: layer_remove,
43
					prev: _g_layer_curr
43
					prev: layer_curr
44 44
				};
45 45
			ly.shade = $(
46 46
				"<div class='layer-shade layer-" + inx + "' style='z-index:" +
@ -196,12 +196,12 @@ $.define(["jQuery", "body", "win"], "util", function($, $body, win) {
196 196
				} else {
197 197
					rd.code = "" + rd.code;
198 198
					rd.url = pUrl;
199
					ajaxErrHand(ep, eh);
199
					ajaxErrHand(rd, eh);
200 200
				}
201 201
			};
202 202
			config.error = function(jqXHR, textStatus, errorThrown) {
203 203
				ajaxErrHand({
204
					code: textStatus,
204
					code: "err_"+(textStatus || ""),
205 205
					msg: textStatus,
206 206
					detailMsg: textStatus,
207 207
					xhr: jqXHR,
@ -212,6 +212,11 @@ $.define(["jQuery", "body", "win"], "util", function($, $body, win) {
212 212
			$.ajax(config).always(false !== config.mask ? unLoading : noop);
213 213
		},
214 214
		buildElement = function(pe, obj) {
215
			if($.isArray(obj)) {
216
				obj.forEach(function(item) {
217
					buildElement(pe, item);
218
				});
219
			}else{
215 220
			var e;
216 221
			if(typeof obj === 'string') {
217 222
				e = doc.createTextNode(obj);
@ -226,10 +231,10 @@ $.define(["jQuery", "body", "win"], "util", function($, $body, win) {
226 231
				}
227 232
				if(obj.chs && obj.chs.length) {
228 233
					obj.chs.forEach(function(ch) {
229
						buildElement(e,ch);
234
						buildElement(e, ch);
230 235
					});
231 236
				}
232
			}
237
			}}
233 238
		};
234 239
235 240
	return {
@ -281,6 +286,7 @@ $.define(["jQuery", "body", "win"], "util", function($, $body, win) {
281 286
			ajaxAccess("post", url, null, sh, eh, pOjb);
282 287
		},
283 288
		noop: noop,
289
		nochange:function(d){return d},
284 290
		returnTrue: function() {
285 291
			return true;
286 292
		},
@ -316,11 +322,11 @@ $.define(["jQuery", "body", "win"], "util", function($, $body, win) {
316 322
		invalid: function($e) {
317 323
			$e.addClass("invald");
318 324
		},
319
		appendChild: function(e,obj) {
325
		appendChild: function(e, obj) {
320 326
			var docf = doc.createDocumentFragment();
321
			buildElement(docf,obj);
327
			buildElement(docf, obj);
322 328
			e.appendChild(docf);
323 329
		},
324
		
330
325 331
	};
326 332
});