├── .babelrc ├── .gitignore ├── README.md ├── assets ├── .gitignore ├── babelrc ├── css │ ├── board.css │ ├── comment.entity.css │ ├── new-board-blog.css │ ├── new-board-common.css │ ├── new-board-create.css │ ├── new-board-footer.css │ ├── new-board-gallery.css │ ├── new-board-header.css │ ├── new-board-pagination.css │ ├── new-board-show.css │ ├── new-board-webzine.css │ ├── new-board.css │ ├── widget.gallery.css │ └── widget.list.css ├── gulpfile.babel.js ├── img │ ├── angle-up.svg │ ├── assent.svg │ ├── assent_up.svg │ ├── board_default_img.png │ ├── bookmark-color.svg │ ├── bookmark.svg │ ├── check.png │ ├── defalut_profile.jpg │ ├── dissent.svg │ ├── dissent_down.svg │ ├── ellipsis-h.svg │ ├── ico_new.png │ ├── icon_new.svg │ ├── img_pen.jpg │ ├── pencil.svg │ ├── screenshots │ │ ├── blog_skin.png │ │ ├── default_skin.png │ │ ├── gallery_skin.png │ │ ├── menuType1.png │ │ ├── plugin1.png │ │ ├── userDefaultSkin1.png │ │ ├── userDefaultSkin2.png │ │ ├── userTestSkin.png │ │ ├── xe-default.jpg │ │ ├── xe-gallery.jpg │ │ └── xe-webzine.jpg │ └── share.svg ├── js │ ├── BoardTags.js │ ├── board.js │ ├── managerSkin.js │ └── src │ │ ├── BoardTags.js │ │ ├── board.js │ │ └── managerSkin.js ├── package.json └── src │ └── scss │ ├── new-board-common.scss │ ├── new-board-create.scss │ ├── new-board-footer.scss │ ├── new-board-gallery.scss │ ├── new-board-header.scss │ ├── new-board-pagination.scss │ ├── new-board-show.scss │ ├── new-board-webzine.scss │ └── new-board.scss ├── board_preview.png ├── components ├── DynamicFields │ └── Category │ │ └── Skins │ │ └── DesignSelect │ │ ├── DesignSelectSkin.php │ │ └── views │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── search.blade.php ├── Modules │ ├── BoardModule.php │ └── views │ │ ├── create.blade.php │ │ └── edit.blade.php ├── Skins │ └── Board │ │ ├── Blog │ │ ├── BlogSkin.php │ │ ├── assets │ │ │ └── css │ │ │ │ └── skin.css │ │ ├── info.php │ │ └── views │ │ │ ├── index.blade.php │ │ │ └── setting.blade.php │ │ ├── Common │ │ ├── CommonSkin.php │ │ ├── info.php │ │ └── views │ │ │ ├── _frame.blade.php │ │ │ ├── create.blade.php │ │ │ ├── default-pagination.blade.php │ │ │ ├── edit.blade.php │ │ │ ├── guestId.blade.php │ │ │ ├── index.blade.php │ │ │ ├── preview.blade.php │ │ │ ├── print.blade.php │ │ │ ├── revision.blade.php │ │ │ ├── setting.blade.php │ │ │ ├── show.blade.php │ │ │ ├── simple-pagination.blade.php │ │ │ ├── votedModal.blade.php │ │ │ ├── votedUserList.blade.php │ │ │ └── votedUsers.blade.php │ │ ├── Gallery │ │ ├── GallerySkin.php │ │ ├── assets │ │ │ └── css │ │ │ │ └── skin.css │ │ ├── info.php │ │ └── views │ │ │ ├── index.blade.php │ │ │ └── setting.blade.php │ │ ├── Settings │ │ └── Common │ │ │ ├── CommonSettingsSkin.php │ │ │ └── views │ │ │ ├── docs │ │ │ ├── index.blade.php │ │ │ └── trash.blade.php │ │ │ ├── global │ │ │ ├── _frame.blade.php │ │ │ ├── config.blade.php │ │ │ ├── index.blade.php │ │ │ ├── permission.blade.php │ │ │ └── toggleMenu.blade.php │ │ │ └── module │ │ │ ├── _frame.blade.php │ │ │ ├── columns.blade.php │ │ │ ├── config.blade.php │ │ │ ├── dynamicField.blade.php │ │ │ ├── editor.blade.php │ │ │ ├── permission.blade.php │ │ │ ├── skin.blade.php │ │ │ └── toggleMenu.blade.php │ │ ├── XEDefault │ │ ├── XEDefault.php │ │ ├── info.php │ │ └── views │ │ │ ├── _frame.blade.php │ │ │ ├── create.blade.php │ │ │ ├── default-pagination.blade.php │ │ │ ├── edit.blade.php │ │ │ ├── guestId.blade.php │ │ │ ├── index.blade.php │ │ │ ├── preview.blade.php │ │ │ ├── print.blade.php │ │ │ ├── revision.blade.php │ │ │ ├── setting.blade.php │ │ │ ├── show.blade.php │ │ │ ├── votedModal.blade.php │ │ │ ├── votedUserList.blade.php │ │ │ └── votedUsers.blade.php │ │ ├── XEGallery │ │ ├── XEGallery.php │ │ ├── assets │ │ │ └── img │ │ │ │ ├── settingDoubleMobile.png │ │ │ │ └── settingSingleMobile.png │ │ ├── info.php │ │ └── views │ │ │ ├── index.blade.php │ │ │ └── setting.blade.php │ │ └── XEWebzine │ │ ├── XEWebzine.php │ │ ├── info.php │ │ └── views │ │ ├── index.blade.php │ │ └── setting.blade.php ├── ToggleMenus │ ├── Boards │ │ ├── PrintItem.php │ │ └── TrashItem.php │ └── Shares │ │ ├── CopyItem.php │ │ ├── FacebookItem.php │ │ ├── LineItem.php │ │ └── TwitterItem.php ├── UIObjects │ ├── DesignSelect │ │ ├── DesignSelectUIObject.php │ │ ├── designSelect.blade.php │ │ └── designSelectItem.blade.php │ ├── NewSelect │ │ ├── NewSelectUIObject.php │ │ ├── assets │ │ │ ├── css │ │ │ │ └── newSelectStyle.css │ │ │ └── js │ │ │ │ └── newSelect.js │ │ ├── newSelect.blade.php │ │ └── newSelectItem.blade.php │ ├── NewTitle │ │ ├── NewTitleUIObject.php │ │ └── title.blade.php │ ├── Share │ │ ├── ShareUIObject.php │ │ ├── assets │ │ │ └── share.js │ │ ├── setting.blade.php │ │ └── share.blade.php │ ├── Tag │ │ ├── TagUIObject.php │ │ └── tag.blade.php │ └── Title │ │ ├── TitleUIObject.php │ │ └── title.blade.php └── Widgets │ └── ArticleList │ ├── ArticleListWidget.php │ ├── Skins │ ├── Basic │ │ ├── BasicCardSkin.php │ │ ├── BasicListSkin.php │ │ ├── assets │ │ │ ├── css │ │ │ │ └── widget-basic.css │ │ │ └── scss │ │ │ │ ├── common │ │ │ │ ├── _mixin.scss │ │ │ │ └── _utilities.scss │ │ │ │ ├── widget-basic.scss │ │ │ │ └── widget │ │ │ │ └── _widget-basic.scss │ │ ├── info-card.php │ │ ├── info-list.php │ │ └── views │ │ │ ├── setting.blade.php │ │ │ ├── widget-card.blade.php │ │ │ └── widget-list.blade.php │ ├── Common │ │ ├── CommonSkin.php │ │ └── views │ │ │ ├── setting.blade.php │ │ │ └── widget.blade.php │ └── Gallery │ │ ├── GallerySkin.php │ │ └── views │ │ ├── setting.blade.php │ │ └── widget.blade.php │ └── views │ ├── category.blade.php │ └── setting.blade.php ├── composer.json ├── icon.png ├── langs └── lang.php ├── markup ├── board_detail.html ├── board_list.html ├── board_list2.html ├── board_list3.html ├── board_no_article.html ├── board_no_article2.html ├── board_write.html ├── new_skin │ ├── layout │ │ ├── _comment.html │ │ ├── _dropdown-category.html │ │ ├── _dropdown-order.html │ │ ├── _footer.html │ │ ├── _header.html │ │ ├── _layout.html │ │ ├── _pagination.html │ │ ├── new-board-comment.html │ │ └── new-board-show.html │ ├── new-board-create.html │ ├── new-board-gallery.html │ ├── new-board-search.html │ ├── new-board-show.html │ ├── new-board-webzine.html │ ├── new-board.html │ └── src │ │ ├── layout │ │ ├── _dropdown-category.html │ │ ├── _dropdown-order.html │ │ ├── _footer.html │ │ ├── _header.html │ │ ├── _layout.html │ │ └── _pagination.html │ │ ├── new-board-create.html │ │ ├── new-board-gallery.html │ │ ├── new-board-search.html │ │ ├── new-board-show.html │ │ ├── new-board-webzine.html │ │ └── new-board.html └── sample │ ├── @iu.jpg │ └── markup_test.js ├── package.json ├── phpunit.xml ├── plugin.php ├── samples ├── .gitignore └── board_flat.png ├── src ├── BoardException.php ├── BoardPermissionHandler.php ├── Commands │ ├── BoardSkinMake.php │ └── stubs │ │ └── board_skin │ │ ├── assets │ │ └── css │ │ │ └── skin.css │ │ ├── info.stub │ │ ├── skin.stub │ │ └── views │ │ ├── create.blade.stub │ │ ├── edit.blade.stub │ │ ├── guestId.blade.stub │ │ ├── index.blade.stub │ │ ├── preview.blade.stub │ │ ├── setting.blade.stub │ │ ├── show.blade.stub │ │ ├── votedModal.blade.stub │ │ ├── votedUserList.blade.stub │ │ └── votedUsers.blade.stub ├── ConfigHandler.php ├── Controllers │ ├── ArchivesController.php │ ├── BoardModuleController.php │ ├── BoardSettingsController.php │ └── ShareSettingsController.php ├── Exceptions │ ├── AlreadyExistFavoriteHttpException.php │ ├── AlreadyExistInstanceException.php │ ├── AlreadyUseCategoryHttpException.php │ ├── CaptchaNotVerifiedException.php │ ├── GuestWrittenSecretDocumentException.php │ ├── HaveNoWritePermissionHttpException.php │ ├── InvalidConfigException.php │ ├── NotFoundConfigHttpException.php │ ├── NotFoundDocumentException.php │ ├── NotFoundFavoriteHttpException.php │ ├── NotMatchedCertifyKeyException.php │ ├── RequiredBoardIdException.php │ └── SecretDocumentHttpException.php ├── GenericBoardSkin.php ├── Handler.php ├── HttpBoardException.php ├── IdentifyManager.php ├── InstanceManager.php ├── Models │ ├── Board.php │ ├── BoardCategory.php │ ├── BoardData.php │ ├── BoardFavorite.php │ ├── BoardGalleryThumb.php │ └── BoardSlug.php ├── Plugin │ ├── Database.php │ ├── Resources.php │ └── Update.php ├── RecycleBin.php ├── Services │ └── BoardService.php ├── UrlHandler.php ├── Validator.php └── helpers.php └── webpack.config.babel.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "targets": { 5 | "browsers": ["last 2 versions", "ie >= 10"] 6 | } 7 | }] 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | vendor 2 | composer.lock 3 | /node_modules 4 | package-lock.json 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 |

5 | 6 | # XE3 Board Plugin 7 | 이 플러그인은 Xpressengine3(이하 XE3)의 플러그인입니다. 8 | 9 | 이 플러그인을 사용하여, 게시판 기능을 사용할 수 있습니다. 10 |

11 | 12 |

13 | 14 | 15 | 16 | ## What can I do? 17 | 18 | 본 플러그인을 사용하여 커뮤니티를 구축/운영 함에 있어서 기본적인 게시판 기능을 수행할 수 있으며, 19 | Comment 플러그인과 같이 사용하여 댓글을 작성할 수 있습니다. 20 | 21 | 그 이외의도 아래의 기능을 지원합니다. 22 | 23 | * 카테고리 생성 / 제거 / 게시글 분류 24 | * 댓글 작성 및 삭제 25 | * 익명으로 글 작성 26 | 27 | ## Installation specification 28 | * Minimum installation environment 29 | XE3, PHP 7.0 or later 30 | * Recommended installation environment 31 | XE3, PHP 7.1 or later 32 | 33 | ## Caution 34 | 본 플러그인과의 의존성이 있는 Comment 플러그인을 삭제하는 경우 정상적인 플러그인 사용이 되지 않을 수 있습니다. 35 | 36 | 37 | 38 | # Installation 39 | ### Console 40 | ``` 41 | $ php artisan plugin:install board 42 | ``` 43 | 44 | ### Web install 45 | - 관리자 > 플러그인 & 업데이트 > 플러그인 목록 내에 새 플러그인 설치 버튼 클릭 46 | - `board` 검색 후 설치하기 47 | 48 | 49 | 50 | # Usage 51 | 관리자 > 사이트 맵> 사이트 메뉴 편집에서 `아이템 추가` 기능으로 게시판을 추가해서 사용합니다. 52 | 게시판 추가는 아래 순서로 가능합니다. 53 | 1. `아이템 추가` 클릭 54 | 2. Board 선택 후 하단에 `다음` 클릭 55 | 3. itemURL, Item Title 등 세부사항 입력 56 | 4. 등록 57 | 58 | # Option 59 | **게시판 기본 설정** 60 | > **Table Division** 61 | > 62 | > 생성되는 게시판 데이터를 분리된 데이터베이스 테이블을 사용하도록 하는 설정입니다. 이 설정을 사용함으로 할 경우 데이터베이스에 새로운 테이블이 추가되어 데이터베이스 데이터 레벨에서 부하분산 될 수 있도록 기능을 제공합니다. 63 | > 64 | > **Revision** 65 | > 66 | > 게시물의 버전 관리를 제공합니다. 버전 관리를 사용할 경우 이전 버전으로 되돌리기 기능 등을 사용할 수 있습니다. 67 | 68 | ## License 69 | 이 플러그인은 LGPL라이선스 하에 있습니다. 70 | ![License](http://img.shields.io/badge/license-GNU%20LGPL-brightgreen.svg) 71 | -------------------------------------------------------------------------------- /assets/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | *.map 4 | -------------------------------------------------------------------------------- /assets/babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["@babel/preset-env", { 4 | "targets": { 5 | "browsers": ["last 2 versions", "ie >= 10"] 6 | } 7 | }] 8 | ], 9 | "plugins": [ 10 | ["babel-plugin-transform-builtin-extend", { 11 | "globals": ["Error", "Array"], 12 | "approximate": true 13 | }] 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /assets/css/comment.entity.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | /* comment_entity */ 4 | .comment_entity .ly_popup { 5 | display: none; 6 | position: absolute; 7 | z-index: 25; 8 | } 9 | .comment_entity .ly_popup ul { 10 | min-width: 140px; 11 | padding: 8px 0; 12 | border: 1px solid #bebebe; 13 | border-radius: 4px; 14 | background-color: #fff; 15 | list-style: none; 16 | } 17 | .comment_entity .ly_popup li { 18 | height: 30px; 19 | } 20 | .comment_entity .ly_popup li > a { 21 | overflow: hidden; 22 | display: block; 23 | height: 100%; 24 | padding: 0 16px; 25 | font-size: 14px; 26 | line-height: 30px; 27 | color: #2c2e37; 28 | } 29 | .comment_entity .ly_popup li > a:hover { 30 | background-color: #f4f4f4; 31 | } -------------------------------------------------------------------------------- /assets/css/new-board-footer.css: -------------------------------------------------------------------------------- 1 | /* footer */ 2 | .xe-list-board-footer .xe-list-board--button-box { 3 | margin-top: 10px; 4 | display: -webkit-box; 5 | display: -ms-flexbox; 6 | display: flex; 7 | -webkit-box-pack: end; 8 | -ms-flex-pack: end; 9 | justify-content: flex-end; 10 | } 11 | 12 | .xe-list-board-footer .xe-list-board--button-box:after { 13 | content: ''; 14 | display: block; 15 | clear: both; 16 | } 17 | 18 | .xe-list-board-footer .xe-list-board--button-box .xe-list-board--btn-left-box, .xe-list-board-footer .xe-list-board--button-box .xe-list-board--btn-right-box { 19 | z-index: 10; 20 | } 21 | 22 | .xe-list-board-footer .xe-list-board--button-box .xe-list-board__btn { 23 | color: #141414; 24 | border: 1px solid #e0e0e0; 25 | text-decoration: none; 26 | margin: 10px 0; 27 | -webkit-transition: all 0.2s; 28 | transition: all 0.2s; 29 | width: 80px; 30 | height: 36px; 31 | } 32 | 33 | .xe-list-board-footer .xe-list-board--button-box .xe-list-board__btn:hover { 34 | background: #f4f5f7; 35 | } 36 | 37 | .xe-list-board-footer .xe-list-board--button-box .xe-list-board__btn.xe-list-board__btn-primary { 38 | background: #f4f5f7; 39 | width: 65px; 40 | border: 0; 41 | } 42 | 43 | .xe-list-board-footer .xe-list-board--button-box .xe-list-board__btn.xe-list-board__btn-primary:hover { 44 | background: #ebecf0; 45 | } 46 | 47 | .xe-list-board-footer .xe-list-board--button-box .xe-list-board__btn.active { 48 | background: #2684ff; 49 | border-color: #2684ff; 50 | color: #fff; 51 | } 52 | 53 | .xe-list-board-footer .xe-list-board--button-box .xe-list-board--btn-left-box { 54 | -webkit-box-flex: 1; 55 | -ms-flex: 1; 56 | flex: 1; 57 | } 58 | 59 | /*# sourceMappingURL=new-board-footer.css.map */ 60 | -------------------------------------------------------------------------------- /assets/css/widget.list.css: -------------------------------------------------------------------------------- 1 | .article-table { 2 | width: 100%; 3 | border-spacing: 0; 4 | border-collapse: collapse; 5 | font-size: 14px; 6 | } 7 | 8 | .article-table-title { 9 | display: inline-block; 10 | margin: 0 0 20px 0; 11 | font-size: 26px; 12 | font-weight: 300; 13 | } 14 | 15 | @media all and (max-width: 974px) { 16 | .article-table-title { 17 | margin-left: -15px; 18 | } 19 | } 20 | 21 | .article-table-more { 22 | display: block; 23 | height: 54px; 24 | margin: 0 0 20px 0; 25 | color: #333; 26 | font-size: 16px; 27 | text-align: center; 28 | line-height: 54px; 29 | text-decoration: none; 30 | } 31 | 32 | .article-table-more.xe-hidden-sm { 33 | float: right; 34 | right: 0; 35 | top: 5px; 36 | height: auto; 37 | margin-top: 9px; 38 | line-height: normal; 39 | } 40 | 41 | .article-table-more.xe-hidden-sm:hover { 42 | color: #526bbe; 43 | } 44 | 45 | .article-table tr td { 46 | display: block; 47 | padding: 15px; 48 | background-color: #fff; 49 | border-bottom: 1px solid #f6f5ec; 50 | width: 1em; 51 | white-space: nowrap; 52 | color: #999; 53 | } 54 | 55 | @media (min-width: 992px) { 56 | .article-table tr td { 57 | display: table-cell; 58 | padding: 23px 0 23px 20px; 59 | } 60 | } 61 | 62 | .article-table tr td:first-child { 63 | padding-bottom: 0; 64 | border-bottom: none; 65 | } 66 | 67 | @media (min-width: 992px) { 68 | .article-table tr td:first-child { 69 | vertical-align: top; 70 | border-bottom: 1px solid #f6f5ec; 71 | } 72 | } 73 | 74 | @media (min-width: 992px) { 75 | .article-table tr td.title { 76 | text-align: left; 77 | } 78 | } 79 | 80 | .article-table tr td.title { 81 | width: auto; 82 | white-space: normal; 83 | } 84 | .article-table tr td.title a { 85 | text-decoration: none; 86 | } 87 | 88 | .article-table tr td.title a strong { 89 | display: block; 90 | font-size: 16px; 91 | font-weight: normal; 92 | color: #333; 93 | height: 1.15em; 94 | overflow: hidden; 95 | white-space: normal; 96 | } 97 | 98 | .article-table tr td.title a strong + P { 99 | margin-top: 5px; 100 | color: #999; 101 | } 102 | 103 | .article-table tr td .xe-badge { 104 | min-height: auto; 105 | padding: 1px 4px; 106 | background-color: #e6e6e6; 107 | border-radius: 0; 108 | transition: none; 109 | color: #333; 110 | font-size: 14px; 111 | text-decoration: none; 112 | line-height: 1.4; 113 | } 114 | 115 | .article-table.type2 td { 116 | padding: 30px 20px; 117 | } 118 | 119 | @media all and (max-width: 974px) { 120 | .article-table.type2 td { 121 | padding: 15px; 122 | margin-left: -15px; 123 | margin-right: -15px; 124 | } 125 | } 126 | 127 | .article-table.type2 td.title { 128 | padding-left: 0px; 129 | } 130 | 131 | @media all and (max-width: 974px) { 132 | .article-table.type2 td.title { 133 | padding-left: 15px; 134 | } 135 | } 136 | 137 | .article-table.type2 .xe-badge { 138 | padding: 2px 4px 1px; 139 | font-size: 13px; 140 | } 141 | 142 | .article-table.type2 .title strong + p { 143 | display: none; 144 | color: red; 145 | } 146 | 147 | .link-more-board { 148 | display: block; 149 | height: 54px; 150 | margin-bottom: 20px; 151 | color: #333; 152 | font-size: 16px; 153 | text-align: center; 154 | line-height: 54px; 155 | text-decoration: none; 156 | } 157 | 158 | .link-more-board.xe-hidden-sm { 159 | float: right; 160 | right: 0; 161 | top: 5px; 162 | height: auto; 163 | margin-top: 9px; 164 | line-height: normal; 165 | } 166 | 167 | .link-more-board.xe-hidden-sm:hover { 168 | color: #526bbe; 169 | } 170 | -------------------------------------------------------------------------------- /assets/gulpfile.babel.js: -------------------------------------------------------------------------------- 1 | const gulp = require('gulp') 2 | const $ = require('gulp-load-plugins')() 3 | const Path = require('path') 4 | let generateSourceMaps = process.env.NODE_ENV !== 'production' 5 | 6 | if (process.env.SOURCEMAPS === 'true' || process.env.SOURCEMAPS === '1') { 7 | generateSourceMaps = true 8 | } 9 | 10 | // scss 사용 할 때 11 | const taskSass = function () { 12 | return gulp.src(['./src/scss/*.scss']) 13 | .pipe($.if(generateSourceMaps, $.sourcemaps.init())) 14 | .pipe($.plumber()) 15 | .pipe($.sass({ 16 | outputStyle: (generateSourceMaps) ? 'expanded' : 'compressed' 17 | }).on('error', $.sass.logError)) 18 | .pipe($.autoprefixer()) 19 | .pipe($.if(generateSourceMaps, $.sourcemaps.write('.'))) 20 | .pipe(gulp.dest('./css')) 21 | } 22 | taskSass.displayName = 'sass' 23 | 24 | const taskPosthtml = function () { 25 | const options = { 26 | root: '../markup/new_skin/src' 27 | } 28 | 29 | const plugins = [ 30 | require('posthtml-extend')(options), 31 | require('posthtml-include')(options) 32 | ] 33 | 34 | return gulp.src(['../markup/new_skin/src/**/*.html', '!**/_*.html']) 35 | .pipe($.posthtml(plugins)) 36 | .pipe(gulp.dest('../markup/new_skin/')) 37 | } 38 | taskPosthtml.displayName = 'posthtml' 39 | 40 | const taskWatch = function () { 41 | gulp.watch(['./src/scss/*.scss'], gulp.series(taskSass)) 42 | gulp.watch(['../markup/new_skin/src/**/*.html'], gulp.series(taskPosthtml)) 43 | } 44 | 45 | gulp.task('default', gulp.series(taskSass)) 46 | gulp.task('build', gulp.series(taskSass)) 47 | gulp.task('watch', taskWatch) 48 | 49 | gulp.task(taskSass) 50 | gulp.task(taskPosthtml) 51 | -------------------------------------------------------------------------------- /assets/img/angle-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /assets/img/assent.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/img/assent_up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /assets/img/board_default_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/board_default_img.png -------------------------------------------------------------------------------- /assets/img/bookmark-color.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/img/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/img/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/check.png -------------------------------------------------------------------------------- /assets/img/defalut_profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/defalut_profile.jpg -------------------------------------------------------------------------------- /assets/img/dissent.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/img/dissent_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /assets/img/ellipsis-h.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /assets/img/ico_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/ico_new.png -------------------------------------------------------------------------------- /assets/img/icon_new.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/img/img_pen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/img_pen.jpg -------------------------------------------------------------------------------- /assets/img/pencil.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /assets/img/screenshots/blog_skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/blog_skin.png -------------------------------------------------------------------------------- /assets/img/screenshots/default_skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/default_skin.png -------------------------------------------------------------------------------- /assets/img/screenshots/gallery_skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/gallery_skin.png -------------------------------------------------------------------------------- /assets/img/screenshots/menuType1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/menuType1.png -------------------------------------------------------------------------------- /assets/img/screenshots/plugin1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/plugin1.png -------------------------------------------------------------------------------- /assets/img/screenshots/userDefaultSkin1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/userDefaultSkin1.png -------------------------------------------------------------------------------- /assets/img/screenshots/userDefaultSkin2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/userDefaultSkin2.png -------------------------------------------------------------------------------- /assets/img/screenshots/userTestSkin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/userTestSkin.png -------------------------------------------------------------------------------- /assets/img/screenshots/xe-default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/xe-default.jpg -------------------------------------------------------------------------------- /assets/img/screenshots/xe-gallery.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/xe-gallery.jpg -------------------------------------------------------------------------------- /assets/img/screenshots/xe-webzine.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/assets/img/screenshots/xe-webzine.jpg -------------------------------------------------------------------------------- /assets/img/share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/js/managerSkin.js: -------------------------------------------------------------------------------- 1 | window.jQuery(function ($) { 2 | $('.list-option-add').bind('click', function (e) { 3 | $('#list_options option').each(function () { 4 | // move to list columns 5 | if ($(this).prop('selected')) { 6 | var newOption = $(this).clone() 7 | 8 | if ($('#list_selected').find('[value="' + newOption.val() + '"]').length === 0) { 9 | $('#list_selected').append(newOption) 10 | $(this).remove() 11 | } 12 | } 13 | }) 14 | }) 15 | 16 | $('.list-option-delete').bind('click', function (e) { 17 | $('#list_selected option').each(function () { 18 | // move to list columns 19 | if ($(this).prop('selected')) { 20 | var newOption = $(this).clone() 21 | if ($('#list_options').find('[value="' + newOption.val() + '"]').length === 0) { 22 | $('#list_options').append(newOption) 23 | $(this).remove() 24 | } 25 | } 26 | }) 27 | }) 28 | 29 | $('.list-option-up').bind('click', function (e) { 30 | var options = $('#list_selected option') 31 | var len = options.length 32 | 33 | for (var i = 0; i < len; i++) { 34 | var option = $(options[i]) 35 | if (option.prop('selected')) { 36 | option.prev().before(option) 37 | } 38 | } 39 | }) 40 | 41 | $('.list-option-down').bind('click', function (e) { 42 | var options = $('#list_selected option') 43 | var len = options.length 44 | 45 | for (var i = len - 1; i >= 0; i--) { 46 | var option = $(options[i]) 47 | if (option.prop('selected')) { 48 | option.next().after(option) 49 | } 50 | } 51 | }) 52 | 53 | $('.form-order-up').bind('click', function (e) { 54 | var options = $('#form_order option') 55 | var len = options.length 56 | 57 | for (var i = 0; i < len; i++) { 58 | var option = $(options[i]) 59 | if (option.prop('selected')) { 60 | option.prev().before(option) 61 | } 62 | } 63 | }) 64 | 65 | $('.form-order-down').bind('click', function (e) { 66 | var options = $('#form_order option') 67 | var len = options.length 68 | 69 | for (var i = len - 1; i >= 0; i--) { 70 | var option = $(options[i]) 71 | if (option.prop('selected')) { 72 | option.next().after(option) 73 | } 74 | } 75 | }) 76 | 77 | $('.form-category-select select').bind('change', function (e) { 78 | var $o = $(this) 79 | var $btn = $o.closest('.form-category-select').find('button') 80 | 81 | if ($o.val() === 'true' && !$o.data('id')) { 82 | window.XE.ajax({ 83 | type: 'post', 84 | dataType: 'json', 85 | url: $o.data('url'), 86 | data: {boardId: $o.data('board-id')}, 87 | success: function (data) { 88 | $o.data('id', data.id) 89 | $btn.attr('disabled', false) 90 | } 91 | }) 92 | } else { 93 | $btn.attr('disabled', $o.val() !== 'true') 94 | } 95 | }) 96 | 97 | $('.inheritCheck').bind('click', function (e) { 98 | var $o = $(this) 99 | var target = $o.data('target') 100 | var select = $o.data('select') 101 | 102 | if (target !== undefined) { 103 | var $target = $o.closest('.form-group').find('[name="' + target + '"]') 104 | $target.prop('disabled', $o.prop('checked')) 105 | $target.trigger('change') 106 | } else if (select !== undefined) { 107 | var $group = $o.closest('.form-group').find(select) 108 | $group.find('button').prop('disabled', $o.prop('checked')) 109 | $group.find('select').prop('disabled', $o.prop('checked')) 110 | } 111 | }) 112 | 113 | $('.form-category-select button').bind('click', function (e) { 114 | var $o = $(this) 115 | var $select = $o.closest('.form-category-select').find('select') 116 | window.open($o.data('href') + '/' + $select.data('id'), '_blank') 117 | }) 118 | }) 119 | -------------------------------------------------------------------------------- /assets/js/src/BoardTags.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueTagsInput from '@johmun/vue-tags-input' 3 | 4 | /* global XE */ 5 | 6 | window.jQuery(function ($) { 7 | const $container = $('.__xe-board-tag') 8 | const $form = $container.closest('form') 9 | const vm = new Vue({ 10 | el: '.__xe-board-tag', 11 | components: { 12 | VueTagsInput 13 | }, 14 | 15 | data () { 16 | return { 17 | tag: '', 18 | tags: [], 19 | autocompleteItems: [], 20 | searchItem: null, 21 | addOnKey: [13, 44], 22 | separators: [',' ] 23 | } 24 | }, 25 | 26 | methods: { 27 | update (newTags) { 28 | this.autocompleteItems = [] 29 | this.tags = newTags 30 | }, 31 | initItems () { 32 | const tags = $container.data('tags') 33 | // console.debug('initItems', $container.data('tags')) 34 | if (tags) { 35 | $container.data('tags').forEach(val => { 36 | this.tags.push({text: val}) 37 | }) 38 | } 39 | 40 | const url = XE.config.getters['router/origin'] + $container.data('url') 41 | this.searchItem = XE.Utils.debounce((keyword) => { 42 | window.XE.ajax({ 43 | url: url, 44 | data: { 45 | string: keyword 46 | }, 47 | type: 'get', 48 | dataType: 'json', 49 | success: (res) => { 50 | const searchItems = [] 51 | res.map(item => { 52 | this.autocompleteItems.push({ text: item.word }) 53 | }) 54 | return searchItems 55 | } 56 | }) 57 | }, 500) 58 | }, 59 | searchItems () { 60 | if (this.tag.length === 0) return 61 | 62 | this.autocompleteItems = [] 63 | this.searchItem(this.tag) 64 | } 65 | }, 66 | 67 | computed: { 68 | tagsArray () { 69 | let values = [] 70 | this.tags.forEach(val => { 71 | values.push(val.text) 72 | }) 73 | return values 74 | } 75 | }, 76 | watch: { 77 | 'tag': 'searchItems' 78 | } 79 | }) 80 | 81 | vm.initItems() 82 | 83 | $form.on('submit', function (event) { 84 | const $this = $(this) 85 | const tags = vm.tagsArray 86 | 87 | $this.find('input[type=hidden].paramTags').remove() 88 | 89 | tags.forEach((val) => { 90 | $this.append(``) 91 | }) 92 | }) 93 | }) 94 | -------------------------------------------------------------------------------- /assets/js/src/managerSkin.js: -------------------------------------------------------------------------------- 1 | window.jQuery(function ($) { 2 | $('.list-option-add').bind('click', function (e) { 3 | $('#list_options option').each(function () { 4 | // move to list columns 5 | if ($(this).prop('selected')) { 6 | var newOption = $(this).clone() 7 | 8 | if ($('#list_selected').find('[value="' + newOption.val() + '"]').length === 0) { 9 | $('#list_selected').append(newOption) 10 | $(this).remove() 11 | } 12 | } 13 | }) 14 | }) 15 | 16 | $('.list-option-delete').bind('click', function (e) { 17 | $('#list_selected option').each(function () { 18 | // move to list columns 19 | if ($(this).prop('selected')) { 20 | var newOption = $(this).clone() 21 | if ($('#list_options').find('[value="' + newOption.val() + '"]').length === 0) { 22 | $('#list_options').append(newOption) 23 | $(this).remove() 24 | } 25 | } 26 | }) 27 | }) 28 | 29 | $('.list-option-up').bind('click', function (e) { 30 | var options = $('#list_selected option') 31 | var len = options.length 32 | 33 | for (var i = 0; i < len; i++) { 34 | var option = $(options[i]) 35 | if (option.prop('selected')) { 36 | option.prev().before(option) 37 | } 38 | } 39 | }) 40 | 41 | $('.list-option-down').bind('click', function (e) { 42 | var options = $('#list_selected option') 43 | var len = options.length 44 | 45 | for (var i = len - 1; i >= 0; i--) { 46 | var option = $(options[i]) 47 | if (option.prop('selected')) { 48 | option.next().after(option) 49 | } 50 | } 51 | }) 52 | 53 | $('.form-order-up').bind('click', function (e) { 54 | var options = $('#form_order option') 55 | var len = options.length 56 | 57 | for (var i = 0; i < len; i++) { 58 | var option = $(options[i]) 59 | if (option.prop('selected')) { 60 | option.prev().before(option) 61 | } 62 | } 63 | }) 64 | 65 | $('.form-order-down').bind('click', function (e) { 66 | var options = $('#form_order option') 67 | var len = options.length 68 | 69 | for (var i = len - 1; i >= 0; i--) { 70 | var option = $(options[i]) 71 | if (option.prop('selected')) { 72 | option.next().after(option) 73 | } 74 | } 75 | }) 76 | 77 | $('.form-category-select select').bind('change', function (e) { 78 | var $o = $(this) 79 | var $btn = $o.closest('.form-category-select').find('button') 80 | 81 | if ($o.val() === 'true' && !$o.data('id')) { 82 | window.XE.ajax({ 83 | type: 'post', 84 | dataType: 'json', 85 | url: $o.data('url'), 86 | data: {boardId: $o.data('board-id')}, 87 | success: function (data) { 88 | $o.data('id', data.id) 89 | $btn.attr('disabled', false) 90 | } 91 | }) 92 | } else { 93 | $btn.attr('disabled', $o.val() !== 'true') 94 | } 95 | }) 96 | 97 | $('.inheritCheck').bind('click', function (e) { 98 | var $o = $(this) 99 | var target = $o.data('target') 100 | var select = $o.data('select') 101 | 102 | if (target !== undefined) { 103 | var $target = $o.closest('.form-group').find('[name="' + target + '"]') 104 | $target.prop('disabled', $o.prop('checked')) 105 | $target.trigger('change') 106 | } else if (select !== undefined) { 107 | var $group = $o.closest('.form-group').find(select) 108 | $group.find('button').prop('disabled', $o.prop('checked')) 109 | $group.find('select').prop('disabled', $o.prop('checked')) 110 | } 111 | }) 112 | 113 | $('.form-category-select button').bind('click', function (e) { 114 | var $o = $(this) 115 | var $select = $o.closest('.form-category-select').find('select') 116 | window.open($o.data('href') + '/' + $select.data('id'), '_blank') 117 | }) 118 | }) 119 | -------------------------------------------------------------------------------- /assets/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "gulp", 5 | "lint": "gulp lint", 6 | "fix-style": "gulp lint:fix-style", 7 | "watch": "gulp watch", 8 | "build": "NODE_ENV=production gulp build" 9 | }, 10 | "browserslist": [ 11 | "last 2 versions", 12 | "ie >= 10" 13 | ], 14 | "devDependencies": { 15 | "@babel/preset-env": "^7.7.7", 16 | "@babel/register": "^7.7.7", 17 | "babel-plugin-transform-builtin-extend": "^1.1.2", 18 | "gulp": "^4.0.2", 19 | "gulp-autoprefixer": "^7.0.1", 20 | "gulp-babel": "^8.0.0", 21 | "gulp-browserify": "^0.5.1", 22 | "gulp-if": "^3.0.0", 23 | "gulp-load-plugins": "^2.0.1", 24 | "gulp-plumber": "^1.2.1", 25 | "gulp-rename": "^2.0.0", 26 | "gulp-sass": "^4.0.2", 27 | "gulp-sourcemaps": "^2.6.5", 28 | "gulp-stylelint": "^11.0.0", 29 | "gulp-util": "^3.0.8", 30 | "gulp-posthtml": "^3.0.4", 31 | "posthtml": "^0.11.6", 32 | "posthtml-extend": "^0.3.0", 33 | "posthtml-include": "^1.2.0", 34 | "stylelint": "^12.0.1", 35 | "stylelint-config-recommended-scss": "^4.1.0", 36 | "stylelint-config-standard": "^19.0.0", 37 | "stylelint-scss": "^3.13.0" 38 | }, 39 | "dependencies": { 40 | "bootstrap": "^4.4.1" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /assets/src/scss/new-board-footer.scss: -------------------------------------------------------------------------------- 1 | /* footer */ 2 | .xe-list-board-footer { 3 | .xe-list-board--button-box { 4 | margin-top: 10px; 5 | display: flex; 6 | justify-content: flex-end; 7 | 8 | &:after { 9 | content: ''; 10 | display: block; 11 | clear: both; 12 | } 13 | 14 | .xe-list-board--btn-left-box, .xe-list-board--btn-right-box { 15 | z-index: 10; 16 | } 17 | 18 | .xe-list-board__btn { 19 | color: #141414; 20 | border: 1px solid #e0e0e0; 21 | text-decoration: none; 22 | margin: 10px 0; 23 | transition: all 0.2s; 24 | width: 80px; 25 | height: 36px; 26 | 27 | &:hover { 28 | background: #f4f5f7; 29 | } 30 | 31 | &.xe-list-board__btn-primary { 32 | background: #f4f5f7; 33 | width: 65px; 34 | border: 0; 35 | 36 | &:hover { 37 | background: #ebecf0; 38 | } 39 | } 40 | 41 | &.active { 42 | background: #2684ff; 43 | border-color: #2684ff; 44 | color: #fff; 45 | } 46 | } 47 | 48 | .xe-list-board--btn-left-box { 49 | flex: 1; 50 | } 51 | } 52 | } 53 | 54 | @media(min-width:576px){ 55 | .xe-list-board-footer { 56 | .xe-list-board--button-box { 57 | .xe-list-board__btn { 58 | } 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /board_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/board_preview.png -------------------------------------------------------------------------------- /components/DynamicFields/Category/Skins/DesignSelect/views/create.blade.php: -------------------------------------------------------------------------------- 1 | {!! uio('uiobject/board@select', [ 2 | 'name' => $key['item_id'], 3 | 'label' => xe_trans($config->get('label')), 4 | 'value' => Request::old($key['item_id']), 5 | 'items' => $data['selectItems'], 6 | ]) !!} -------------------------------------------------------------------------------- /components/DynamicFields/Category/Skins/DesignSelect/views/edit.blade.php: -------------------------------------------------------------------------------- 1 | {!! uio('uiobject/board@select', [ 2 | 'name' => $key['item_id'], 3 | 'label' => xe_trans($config->get('label')), 4 | 'value' => $data['item_id'] != null ? $data['item_id'] : '', 5 | 'items' => $data['selectItems'], 6 | ]) !!} -------------------------------------------------------------------------------- /components/DynamicFields/Category/Skins/DesignSelect/views/search.blade.php: -------------------------------------------------------------------------------- 1 | {!! uio('uiobject/board@select', [ 2 | 'name' => $key['item_id'], 3 | 'label' => xe_trans($config->get('label')), 4 | 'value' => $data['categoryItem'] != null ? $data['categoryItem']->id : '', 5 | 'items' => $data['selectItems'], 6 | ]) !!} -------------------------------------------------------------------------------- /components/Modules/views/create.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

6 | {{xe_trans('board::boardBasicSetting')}} 7 |

8 |
9 | 12 |
13 |
14 |
15 |
16 |

For web master's
{{xe_trans('board::msgCannotChangeThisSetting')}}

17 | 18 | 19 | 23 | 24 |
25 |
26 | 27 | 28 | 32 |
33 | 34 |
35 |
36 |
37 |
38 | 39 | -------------------------------------------------------------------------------- /components/Modules/views/edit.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

6 | {{xe_trans('board::boardBasicSetting')}} 7 |

8 |
9 | 12 |
13 |
14 |
15 |
16 | 17 |
18 | 19 |
20 | 21 |
22 |
23 |
24 |
25 |
26 | -------------------------------------------------------------------------------- /components/Skins/Board/Blog/BlogSkin.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | 15 | namespace Xpressengine\Plugins\Board\Components\Skins\Board\Blog; 16 | 17 | use Xpressengine\Plugins\Board\Components\Skins\Board\Gallery\GallerySkin; 18 | 19 | /** 20 | * BlogSkin 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class BlogSkin extends GallerySkin 30 | { 31 | protected static $path = 'board/components/Skins/Board/Blog'; 32 | } 33 | -------------------------------------------------------------------------------- /components/Skins/Board/Blog/assets/css/skin.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/components/Skins/Board/Blog/assets/css/skin.css -------------------------------------------------------------------------------- /components/Skins/Board/Blog/info.php: -------------------------------------------------------------------------------- 1 | [ 4 | 'sample_text' => [ 5 | '_type' => 'text', 6 | '_section' => '기본설정', 7 | 'label' => '샘플 문구', 8 | 'placeholder' => '샘플용 설정 필드입니다.', 9 | 'description' => '샘플용 설정 필드입니다.', 10 | ], 11 | ], 12 | 'support' => [ 13 | 'mobile' => true, 14 | 'desktop' => true 15 | ] 16 | ]; 17 | -------------------------------------------------------------------------------- /components/Skins/Board/Blog/views/setting.blade.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/components/Skins/Board/Blog/views/setting.blade.php -------------------------------------------------------------------------------- /components/Skins/Board/Common/info.php: -------------------------------------------------------------------------------- 1 | [ 5 | // 'sample_text' => [ 6 | // '_type' => 'text', 7 | // '_section' => '기본설정', 8 | // 'label' => '샘플 문구', 9 | // 'placeholder' => '샘플용 설정 필드입니다.', 10 | // 'description' => '샘플용 설정 필드입니다.', 11 | // ], 12 | // ], 13 | // 'support' => [ 14 | // 'mobile' => true, 15 | // 'desktop' => true 16 | // ] 17 | //]; 18 | -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/_frame.blade.php: -------------------------------------------------------------------------------- 1 | {{ XeFrontend::js('plugins/board/assets/js/board.js')->appendTo('body')->load() }} 2 | {{ XeFrontend::css('plugins/board/assets/css/board.css')->load() }} 3 | 4 | 5 |
6 | 7 | @if ($config->get('topCommonContentOnlyList') === false || request()->segment(2) == '') 8 | {!! xe_trans($config->get('topCommonContent', '')) !!} 9 | @endif 10 | 11 | @section('content') 12 | {!! isset($content) ? $content : '' !!} 13 | @show 14 | 15 | 16 | @if ($config->get('bottomCommonContentOnlyList') === false || request()->segment(2) == '') 17 | {!! xe_trans($config->get('bottomCommonContent', '')) !!} 18 | @endif 19 | 20 |
21 | 22 | -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/default-pagination.blade.php: -------------------------------------------------------------------------------- 1 | @if ($paginator->hasPages()) 2 |
3 | @if($paginator->currentPage() <= 1) 4 | « 5 | @else 6 | « 7 | @endif 8 | 9 | @foreach ($elements as $element) 10 | {{-- "Three Dots" Separator --}} 11 | @if (is_string($element)) 12 | {{ $element }} 13 | @endif 14 | 15 | {{-- Array Of Links --}} 16 | @if (is_array($element)) 17 | @foreach ($element as $page => $url) 18 | @if ($page == $paginator->currentPage()) 19 | {{ $page }} 20 | @else 21 | {{ $page }} 22 | @endif 23 | @endforeach 24 | @endif 25 | @endforeach 26 | 27 | 28 | @if(!$paginator->hasMorePages()) 29 | » 30 | @else 31 | » 32 | @endif 33 |
34 | @endif 35 | 36 | -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/guestId.blade.php: -------------------------------------------------------------------------------- 1 | {{ XeFrontend::rule('board', $rules) }} 2 | 3 | {!! XeFrontend::css('assets/core/user/auth.css')->load() !!} 4 |
5 |

{{ xe_trans('xe::identification') }}

6 |
7 | 8 | 9 | 10 | 11 |
12 | {{ xe_trans('xe::identification') }} 13 |
14 | 15 | 16 |
17 |
18 | 19 | 20 |
21 | 22 | 23 |
24 |
25 |
26 | -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/preview.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @foreach ($skinConfig['formColumns'] as $columnName) 3 | @if($columnName === 'title') 4 |
5 | @if($showCategoryItem) 6 | {{ xe_trans($showCategoryItem->word) }} 7 | @endif 8 | 9 |

{!! $title !!}

10 | 11 |
12 | {{ $writer }} 13 | {{$currentDate}} 14 | 0 15 |
16 | 17 |
18 | @elseif($columnName === 'content') 19 |
20 | {{-- @DEPRECATED .xe_content --}} 21 |
22 | {!! compile($config->get('boardId'), $content, $format === Xpressengine\Plugins\Board\Models\Board::FORMAT_HTML) !!} 23 |
24 |
25 | @elseif (($fieldType = XeDynamicField::get($config->get('documentGroup'), $columnName)) != null && isset($dynamicFieldsById[$columnName]) && $dynamicFieldsById[$columnName]->get('use') == true) 26 |
27 | {!! $fieldType->getSkin()->show(request()->all()) !!} 28 |
29 | @endif 30 | @endforeach 31 | 32 | @foreach ($fieldTypes as $dynamicFieldConfig) 33 | @if (in_array($dynamicFieldConfig->get('id'), $skinConfig['formColumns']) === false && ($fieldType = XeDynamicField::getByConfig($dynamicFieldConfig)) != null && $dynamicFieldConfig->get('use') == true) 34 |
35 | {!! $fieldType->getSkin()->show(request()->all()) !!} 36 |
37 | @endif 38 | @endforeach 39 |
40 | -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/print.blade.php: -------------------------------------------------------------------------------- 1 |
2 | @foreach ($skinConfig['formColumns'] as $columnName) 3 | @if($columnName === 'title') 4 |
5 | @if($item->status == $item::STATUS_NOTICE) 6 | {{ xe_trans('xe::notice') }} @if($config->get('category') == true && $item->boardCategory !== null){{ xe_trans($item->boardCategory->getWord()) }}@endif 7 | @elseif($config->get('category') == true && $item->boardCategory !== null) 8 | {{ xe_trans($item->boardCategory->getWord()) }} 9 | @endif 10 |

{!! $item->title !!}

11 | 12 |
13 | 14 | @if ($item->hasAuthor() && $config->get('anonymity') === false) 15 | $item->getUserId(), 'type'=>'user']) !!}'>{{ $item->writer }} 19 | @else 20 | {{ $item->writer }} 21 | @endif 22 | 23 | {{$item->created_at}} 24 | {{$item->read_count}} 25 |
26 |
27 | @elseif($columnName === 'content') 28 |
29 | {{-- @DEPRECATED .xe_content --}} 30 |
31 | {!! compile($item->instance_id, $item->content, $item->format === Xpressengine\Plugins\Board\Models\Board::FORMAT_HTML) !!} 32 |
33 |
34 | @elseif (($fieldType = XeDynamicField::get($config->get('documentGroup'), $columnName)) != null && isset($dynamicFieldsById[$columnName]) && $dynamicFieldsById[$columnName]->get('use') == true) 35 |
36 | {!! $fieldType->getSkin()->show($item->getAttributes()) !!} 37 |
38 | @endif 39 | @endforeach 40 | 41 | @foreach ($fieldTypes as $dynamicFieldConfig) 42 | @if (in_array($dynamicFieldConfig->get('id'), $skinConfig['formColumns']) === false && ($fieldType = XeDynamicField::getByConfig($dynamicFieldConfig)) != null && $dynamicFieldConfig->get('use') == true) 43 |
44 | {!! $fieldType->getSkin()->show($item->getAttributes()) !!} 45 |
46 | @endif 47 | @endforeach 48 | 49 |
50 | 51 | 56 | -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/revision.blade.php: -------------------------------------------------------------------------------- 1 | @foreach ($docs as $doc) 2 |
3 | Revision NO : {{ $doc->revisionNo }} 4 | / 5 | Update date : {{ $doc->updated_at }} 6 |
7 | 8 |
9 | @foreach ($formColumns as $columnName) 10 | @if ($columnName == 'title') 11 | 12 | 17 |
18 | {!! $doc->writer !!} 19 |
20 | @elseif ($columnName == 'content') 21 |
22 | {!! $doc->content !!} 23 |
24 | @elseif (($fieldType = XeDynamicField::get($config->get('documentGroup'), $columnName)) != null) 25 |
26 | {!! $fieldType->getSkin()->show($fieldType->getConfig(), $doc->getAttributes()) !!} 27 |
28 | @endif 29 | @endforeach 30 |
31 | @endforeach -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/simple-pagination.blade.php: -------------------------------------------------------------------------------- 1 | @if ($paginator->hasPages()) 2 |
3 | @if($paginator->currentPage() <= 1) 4 | « 5 | @else 6 | « 7 | @endif 8 | 9 | {{ $paginator->currentPage() }} / {{ $paginator->lastPage() }} 10 | 11 | 12 | @if(!$paginator->hasMorePages()) 13 | » 14 | @else 15 | » 16 | @endif 17 |
18 | @endif 19 | 20 | -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/votedModal.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{xe_trans('board::assentThisPosts', ['count' => $count])}} 4 |
5 | 6 |
7 | 8 | -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/votedUserList.blade.php: -------------------------------------------------------------------------------- 1 | @foreach($paginate as $log) 2 | @if($log->user->getId() == Auth::user()->getId()) 3 |
  • 4 | 5 |
    6 | 7 |
    {{$log->user->getDisplayName()}}
    8 |
    9 |

    {{$log->user->getDisplayName()}}

    10 |
    11 |
    12 |
  • 13 | @else 14 |
  • 15 | 16 |
    {{$log->user->getDisplayName()}}
    17 |
    18 |

    {{$log->user->getDisplayName()}}

    19 | {{$log->created_at}} 20 |
    21 |
    22 |
  • 23 | @endif 24 | @endforeach -------------------------------------------------------------------------------- /components/Skins/Board/Common/views/votedUsers.blade.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | @if ($item->assent_count > 10) 14 |

    {!! xe_trans('board::assentThisPostsOthers', [ 15 | 'count'=> sprintf('%s', $urlHandler->get('votedModal', ['option' => $option, 'id' => $item->id]), $item->assent_count - 1), 16 | ]) !!}

    17 | @endif 18 | -------------------------------------------------------------------------------- /components/Skins/Board/Gallery/assets/css/skin.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/components/Skins/Board/Gallery/assets/css/skin.css -------------------------------------------------------------------------------- /components/Skins/Board/Gallery/info.php: -------------------------------------------------------------------------------- 1 | [ 4 | 'sample_text' => [ 5 | '_type' => 'text', 6 | '_section' => '기본설정', 7 | 'label' => '샘플 문구', 8 | 'placeholder' => '샘플용 설정 필드입니다.', 9 | 'description' => '샘플용 설정 필드입니다.', 10 | ], 11 | ], 12 | 'support' => [ 13 | 'mobile' => true, 14 | 'desktop' => true 15 | ] 16 | ]; 17 | -------------------------------------------------------------------------------- /components/Skins/Board/Gallery/views/setting.blade.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/components/Skins/Board/Gallery/views/setting.blade.php -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/CommonSettingsSkin.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Components\Skins\Board\Settings\Common; 15 | 16 | use Xpressengine\Presenter\Presenter; 17 | use Xpressengine\Skin\AbstractSkin; 18 | use View; 19 | use XePresenter; 20 | 21 | /** 22 | * SettingsSkin 23 | * 24 | * @category Board 25 | * @package Xpressengine\Plugins\Board 26 | * @author XE Developers 27 | * @copyright 2019 Copyright XEHub Corp. 28 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 29 | * @link https://xpressengine.io 30 | */ 31 | class CommonSettingsSkin extends AbstractSkin 32 | { 33 | /** 34 | * @var string 35 | */ 36 | protected static $skinAlias = 'board/components/Skins/Board/Settings/Common/views'; 37 | 38 | /** 39 | * render 40 | * 41 | * @return \Illuminate\View\View 42 | */ 43 | public function render() 44 | { 45 | $contentView = View::make( 46 | sprintf('%s.%s', static::$skinAlias, $this->view), 47 | $this->data 48 | ); 49 | 50 | $parts = pathinfo($contentView->getPath()); 51 | $names = explode('/', $parts['dirname']); 52 | $subPath =array_pop($names); 53 | $active = substr($parts['filename'], 0, stripos($parts['filename'], '.')); 54 | $this->data['_active'] = $active; 55 | 56 | if (XePresenter::getRenderType() == Presenter::RENDER_CONTENT) { 57 | $view = $contentView; 58 | } elseif($subPath === 'global' || $subPath === 'module') { 59 | // wrapped by _frame.blade.php 60 | $this->data['afea'] = 1; 61 | $view = View::make(sprintf('%s.%s._frame', static::$skinAlias, $subPath), $this->data); 62 | $view->content = $contentView->render(); 63 | } else { 64 | $view = $contentView; 65 | } 66 | 67 | return $view; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/global/_frame.blade.php: -------------------------------------------------------------------------------- 1 | {{ XeFrontend::js('plugins/board/assets/js/managerSkin.js')->load() }} 2 | 3 | {{-- $_active 는 SettingsSkin 에서 처리됨 --}} 4 | 9 | 10 | {!! $content !!} -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/global/index.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | @foreach($configs as $config) 13 | 14 | 15 | 16 | 17 | 18 | 19 | @endforeach 20 | 21 |
    Board Manager
    #Board IDNameConfig
    #{{ $config->get('boardId') }}{{ $config->get('boardName', '') }}config
    22 | -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/global/permission.blade.php: -------------------------------------------------------------------------------- 1 | @section('page_title') 2 |

    {{xe_trans('board::boardDetailConfigures')}}

    3 | @endsection 4 | 5 | @section('page_description') 6 | @endsection 7 | 8 | 9 |
    10 |
    11 |
    12 |
    13 |
    14 |
    15 |

    {{xe_trans('xe::permission')}}

    16 |
    17 |
    18 |
    19 | 20 |
    21 |
    22 | 23 | @foreach ($perms as $perm) 24 |
    25 |
    26 |
    27 | 28 |
    29 | {!! uio('permission', $perm) !!} 30 |
    31 |
    32 |
    33 |
    34 | @endforeach 35 | 36 |
    37 | 42 |
    43 |
    44 |
    45 |
    46 |
    47 |
    48 | -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/global/toggleMenu.blade.php: -------------------------------------------------------------------------------- 1 | @section('page_title') 2 |

    {{xe_trans('board::boardDetailConfigures')}}

    3 | @endsection 4 | 5 | @section('page_description') 6 | @endsection 7 | 8 | 9 |
    10 |
    11 |
    12 |
    13 |
    14 |
    15 |

    {{xe_trans('xe::toggleMenu')}}

    16 |
    17 |
    18 |
    19 |
    20 | {!! $toggleMenuSection !!} 21 |
    22 |
    23 |
    24 | 25 |
    26 |
    27 |
    28 | -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/module/_frame.blade.php: -------------------------------------------------------------------------------- 1 | {{ XeFrontend::js('plugins/board/assets/js/managerSkin.js')->load() }} 2 | 3 | {{-- $_active 는 SettingsSkin 에서 처리됨 --}} 4 | 13 | 14 | {!! $content !!} 15 | 16 | {{ XeFrontend::js('assets/vendor/jqueryui/jquery-ui.min.js')->load() }} -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/module/dynamicField.blade.php: -------------------------------------------------------------------------------- 1 | @section('page_title') 2 |

    {{xe_trans('board::boardDetailConfigures')}}

    3 | @endsection 4 | 5 | @section('page_description')@endsection 6 | 7 | 8 |
    9 |
    10 |
    11 |
    12 |
    13 |
    14 |

    {{xe_trans('xe::dynamicField')}}

    15 |
    16 |
    17 |
    18 |
    19 | {!! $dynamicFieldSection !!} 20 |
    21 | 23 | 24 |
    25 |
    26 |
    27 |
    28 |
    -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/module/editor.blade.php: -------------------------------------------------------------------------------- 1 | @section('page_title') 2 |

    {{xe_trans('board::boardDetailConfigures')}}

    3 | @endsection 4 | 5 | @section('page_description')@endsection 6 | 7 | 8 |
    9 |
    10 |
    11 |
    12 |
    13 |
    14 |

    {{xe_trans('xe::editor')}}

    15 |
    16 |
    17 |
    18 |
    19 | {!! $editorSection !!} 20 |
    21 |
    22 |
    23 |
    24 |
    25 |
    -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/module/permission.blade.php: -------------------------------------------------------------------------------- 1 | @section('page_title') 2 |

    {{xe_trans('board::boardDetailConfigures')}}

    3 | @endsection 4 | 5 | @section('page_description')@endsection 6 | 7 | 8 |
    9 |
    10 |
    11 |
    12 |
    13 |
    14 |

    {{xe_trans('xe::permission')}}

    15 | {{xe_trans('xe::moveToParentSettingPage')}} 16 |
    17 |
    18 |
    19 | 20 |
    21 |
    22 | 23 | @foreach ($perms as $perm) 24 |
    25 |
    26 |
    27 | 28 |
    29 | {!! uio('permission', $perm) !!} 30 |
    31 |
    32 |
    33 |
    34 | @endforeach 35 | 36 |
    37 | 42 |
    43 |
    44 |
    45 |
    46 |
    47 |
    -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/module/skin.blade.php: -------------------------------------------------------------------------------- 1 | @section('page_title') 2 |

    {{xe_trans('board::boardDetailConfigures')}}

    3 | @endsection 4 | 5 | @section('page_description')@endsection 6 | 7 | 8 |
    9 |
    10 |
    11 |
    12 |
    13 |
    14 |

    {{xe_trans('xe::skin')}}

    15 |
    16 |
    17 |
    18 |
    19 | {!! $skinSection !!} 20 |
    21 |
    22 |
    23 | 24 |
    25 |
    26 |
    -------------------------------------------------------------------------------- /components/Skins/Board/Settings/Common/views/module/toggleMenu.blade.php: -------------------------------------------------------------------------------- 1 | @section('page_title') 2 |

    {{xe_trans('board::boardDetailConfigures')}}

    3 | @endsection 4 | 5 | @section('page_description')@endsection 6 | 7 | 8 |
    9 |
    10 |
    11 |
    12 |
    13 |
    14 |

    {{xe_trans('xe::toggleMenu')}}

    15 | {{xe_trans('xe::moveToParentSettingPage')}} 16 |
    17 |
    18 |
    19 |
    20 | {!! $toggleMenuSection !!} 21 |
    22 |
    23 |
    24 |
    25 |
    26 |
    -------------------------------------------------------------------------------- /components/Skins/Board/XEDefault/info.php: -------------------------------------------------------------------------------- 1 | 'setting', 5 | 'support' => [ 6 | 'mobile' => true, 7 | 'desktop' => true 8 | ] 9 | ]; 10 | -------------------------------------------------------------------------------- /components/Skins/Board/XEDefault/views/_frame.blade.php: -------------------------------------------------------------------------------- 1 | {{ XeFrontend::js('plugins/board/assets/js/board.js')->appendTo('body')->load() }} 2 | {{ XeFrontend::js('assets/core/xe-ui-component/js/xe-page.js')->appendTo('body')->load() }} 3 | 4 | {{ XeFrontend::css('plugins/board/assets/css/new-board-common.css')->load() }} 5 | {{ XeFrontend::css('plugins/board/assets/css/new-board-header.css')->load() }} 6 | {{ XeFrontend::css('plugins/board/assets/css/new-board-footer.css')->load() }} 7 | 8 | {{ expose_trans('board::selectPost') }} 9 | {{ expose_trans('board::selectBoard') }} 10 | {{ expose_trans('board::msgDeleteConfirm') }} 11 | 12 | 13 |
    14 | @if ($config->get('topCommonContentOnlyList') === false || request()->segment(2) === '') 15 |
    16 | {!! xe_trans($config->get('topCommonContent', '')) !!} 17 |
    18 | @endif 19 |
    20 |
    21 | @if (request()->segment(2) === null) 22 |
    23 |
    24 | @if (in_array(array_get($skinConfig, 'titleStyle', 'titleWithCount'), ['titleWithCount', 'title']) === true) 25 |

    26 | 27 | @if (xe_trans($config->get('boardName', '')) !== '') 28 | {{ xe_trans($config->get('boardName')) }} 29 | @else 30 | {{ xe_trans(current_menu()['title']) }} 31 | @endif 32 | 33 |

    34 | @if (array_get($skinConfig, 'titleStyle', 'titleWithCount') === 'titleWithCount') 35 | ({{ number_format($paginate->total()) }}) 36 | @endif 37 | @endif 38 |
    39 | @if (array_get($skinConfig, 'visibleIndexMobileWriteButton', 'on') === 'on') 40 | @if (array_get($skinConfig, 'visibleIndexWriteButton', 'show') === 'show') 41 |
    42 | 모바일 글쓰기 이미지 43 |
    44 | @elseif (request()->segment(2) === null && array_get($skinConfig, 'visibleIndexWriteButton', 'show') === 'permission' && $isWritable === true) 45 |
    46 | 모바일 글쓰기 이미지 47 |
    48 | @endif 49 | @endif 50 |
    51 | @endif 52 |
    53 | @section('content') 54 | {!! isset($content) ? $content : '' !!} 55 | @show 56 |
    57 | @if ($config->get('bottomCommonContentOnlyList') === false || request()->segment(2) === '') 58 | 61 | @endif 62 |
    63 | -------------------------------------------------------------------------------- /components/Skins/Board/XEDefault/views/guestId.blade.php: -------------------------------------------------------------------------------- 1 | {{ XeFrontend::rule('board', $rules) }} 2 | 3 | {!! XeFrontend::css('assets/core/user/auth.css')->load() !!} 4 |
    5 |

    {{ xe_trans('xe::identification') }}

    6 |
    7 | 8 | 9 | 10 | 11 |
    12 | {{ xe_trans('xe::identification') }} 13 |
    14 | 15 | 16 |
    17 |
    18 | 19 | 20 |
    21 | 22 | 23 |
    24 |
    25 |
    26 | -------------------------------------------------------------------------------- /components/Skins/Board/XEDefault/views/revision.blade.php: -------------------------------------------------------------------------------- 1 | @foreach ($docs as $doc) 2 |
    3 | Revision NO : {{ $doc->revisionNo }} 4 | / 5 | Update date : {{ $doc->updated_at }} 6 |
    7 | 8 |
    9 | @foreach ($formColumns as $columnName) 10 | @if ($columnName == 'title') 11 | 12 | 17 |
    18 | {!! $doc->writer !!} 19 |
    20 | @elseif ($columnName == 'content') 21 |
    22 | {!! $doc->content !!} 23 |
    24 | @elseif (($fieldType = XeDynamicField::get($config->get('documentGroup'), $columnName)) != null) 25 |
    26 | {!! $fieldType->getSkin()->show($fieldType->getConfig(), $doc->getAttributes()) !!} 27 |
    28 | @endif 29 | @endforeach 30 |
    31 | @endforeach -------------------------------------------------------------------------------- /components/Skins/Board/XEDefault/views/votedModal.blade.php: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 | @if ($option === 'assent') 5 | {{ xe_trans('board::assentThisPosts', ['count' => $count]) }} 6 | @elseif ($option === 'dissent') 7 | {{ xe_trans('board::dissentThisPosts', ['count' => $count]) }} 8 | @endif 9 | 10 |
    11 | 12 |
    13 | 14 | 17 | -------------------------------------------------------------------------------- /components/Skins/Board/XEDefault/views/votedUserList.blade.php: -------------------------------------------------------------------------------- 1 | @foreach($paginate as $log) 2 | @if($log->user->getId() == Auth::user()->getId()) 3 |
  • 4 | 5 |
    6 | 7 |
    {{$log->user->getDisplayName()}}
    8 |
    9 |

    {{$log->user->getDisplayName()}}

    10 |
    11 |
    12 |
  • 13 | @else 14 |
  • 15 | 16 |
    {{$log->user->getDisplayName()}}
    17 |
    18 |

    {{$log->user->getDisplayName()}}

    19 | {{$log->created_at}} 20 |
    21 |
    22 |
  • 23 | @endif 24 | @endforeach -------------------------------------------------------------------------------- /components/Skins/Board/XEDefault/views/votedUsers.blade.php: -------------------------------------------------------------------------------- 1 | 11 | 12 | @if ($option === 'assent') 13 | @if ($item->assent_count > 10) 14 |

    {!! xe_trans('board::assentThisPosts', [ 15 | 'count'=> sprintf('%s', $urlHandler->get('votedModal', ['option' => $option, 'id' => $item->id]), $item->assent_count), 16 | ]) !!}

    17 | @endif 18 | @elseif ($option === 'dissent') 19 | @if ($item->dissent_count > 10) 20 |

    {!! xe_trans('board::dissentThisPosts', [ 21 | 'count'=> sprintf('%s', $urlHandler->get('votedModal', ['option' => $option, 'id' => $item->id]), $item->dissent_count), 22 | ]) !!}

    23 | @endif 24 | @endif 25 | -------------------------------------------------------------------------------- /components/Skins/Board/XEGallery/assets/img/settingDoubleMobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/components/Skins/Board/XEGallery/assets/img/settingDoubleMobile.png -------------------------------------------------------------------------------- /components/Skins/Board/XEGallery/assets/img/settingSingleMobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/components/Skins/Board/XEGallery/assets/img/settingSingleMobile.png -------------------------------------------------------------------------------- /components/Skins/Board/XEGallery/info.php: -------------------------------------------------------------------------------- 1 | 'setting', 4 | 'support' => [ 5 | 'mobile' => true, 6 | 'desktop' => true 7 | ] 8 | ]; 9 | -------------------------------------------------------------------------------- /components/Skins/Board/XEWebzine/XEWebzine.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2020 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | 15 | namespace Xpressengine\Plugins\Board\Components\Skins\Board\XEWebzine; 16 | 17 | use Xpressengine\Plugins\Board\Components\Skins\Board\XEGallery\XEGallery; 18 | 19 | /** 20 | * XEWebzine 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2020 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class XEWebzine extends XEGallery 30 | { 31 | protected static $path = 'board/components/Skins/Board/XEWebzine'; 32 | 33 | public function resolveSetting(array $inputs = []) 34 | { 35 | if (isset($inputs['visibleIndexBlogProfileImage']) === false) { 36 | $inputs['visibleIndexBlogProfileImage'] = ''; 37 | } 38 | 39 | if (isset($inputs['visibleIndexBlogDescription']) === false) { 40 | $inputs['visibleIndexBlogDescription'] = ''; 41 | } 42 | 43 | return parent::resolveSetting($inputs); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /components/Skins/Board/XEWebzine/info.php: -------------------------------------------------------------------------------- 1 | 'setting', 4 | 'support' => [ 5 | 'mobile' => true, 6 | 'desktop' => true 7 | ] 8 | ]; 9 | -------------------------------------------------------------------------------- /components/ToggleMenus/Boards/PrintItem.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Components\ToggleMenus\Boards; 15 | 16 | use Gate; 17 | use Xpressengine\Plugins\Board\Models\Board; 18 | use Xpressengine\Plugins\Board\BoardPermissionHandler; 19 | use Xpressengine\ToggleMenu\AbstractToggleMenu; 20 | use Xpressengine\Permission\Instance; 21 | 22 | /** 23 | * PrintItem 24 | * 25 | * @category Board 26 | * @package Xpressengine\Plugins\Board 27 | * @author XE Developers 28 | * @copyright 2019 Copyright XEHub Corp. 29 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 30 | * @link https://xpressengine.io 31 | */ 32 | class PrintItem extends AbstractToggleMenu 33 | { 34 | /** 35 | * get text 36 | * 37 | * @return string 38 | */ 39 | public function getText() 40 | { 41 | return xe_trans('board::print'); 42 | } 43 | 44 | /** 45 | * get type 46 | * 47 | * @return string 48 | */ 49 | public function getType() 50 | { 51 | return static::MENUTYPE_RAW; 52 | } 53 | 54 | /** 55 | * get action url 56 | * 57 | * @return string 58 | */ 59 | public function getAction() 60 | { 61 | $doc = Board::find($this->identifier); 62 | 63 | $url = app('xe.board.url')->get('print', ['id' => $this->identifier], $doc->instance_id); 64 | 65 | return ''.$this->getText().''; 66 | } 67 | 68 | /** 69 | * get script 70 | * 71 | * @return null 72 | */ 73 | public function getScript() 74 | { 75 | return null; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /components/ToggleMenus/Boards/TrashItem.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Components\ToggleMenus\Boards; 15 | 16 | use Gate; 17 | use Xpressengine\Plugins\Board\Models\Board; 18 | use Xpressengine\Plugins\Board\BoardPermissionHandler; 19 | use Xpressengine\ToggleMenu\AbstractToggleMenu; 20 | use Xpressengine\Permission\Instance; 21 | 22 | /** 23 | * TrashItem 24 | * 25 | * Toggle menu item 26 | * 팝업 메뉴에 휴지통으로 이동 처리 27 | * 28 | * @category Board 29 | * @package Xpressengine\Plugins\Board 30 | * @author XE Developers 31 | * @copyright 2019 Copyright XEHub Corp. 32 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 33 | * @link https://xpressengine.io 34 | */ 35 | class TrashItem extends AbstractToggleMenu 36 | { 37 | /** 38 | * check permission 39 | * 40 | * @return bool 41 | */ 42 | public function allows() 43 | { 44 | $doc = Board::find($this->identifier); 45 | $configHandler = app('xe.board.config'); 46 | $boardPermission = app('xe.board.permission'); 47 | 48 | $config = $configHandler->get($doc->instance_id); 49 | $isManger = false; 50 | if ($config !== null) { 51 | 52 | if (Gate::allows( 53 | BoardPermissionHandler::ACTION_MANAGE, 54 | new Instance($boardPermission->name($doc->instance_id)) 55 | )) { 56 | $isManger = true; 57 | }; 58 | } 59 | 60 | return $isManger; 61 | } 62 | 63 | /** 64 | * get text 65 | * 66 | * @return string 67 | */ 68 | public function getText() 69 | { 70 | return xe_trans('xe::moveToTrash'); 71 | } 72 | 73 | /** 74 | * get type 75 | * 76 | * @return string 77 | */ 78 | public function getType() 79 | { 80 | return static::MENUTYPE_EXEC; 81 | } 82 | 83 | /** 84 | * get action url 85 | * 86 | * @return string 87 | */ 88 | public function getAction() 89 | { 90 | $doc = Board::find($this->identifier); 91 | 92 | $url = app('xe.board.url')->get('trash', ['id' => $this->identifier], $doc->instance_id); 93 | 94 | return 'var url = "' . $url . '" + window.location.search; 95 | XE.ajax(url, { 96 | type: "post", 97 | dataType: "json", 98 | data: { 99 | id: "' . $this->identifier . '" 100 | }, 101 | success: function (data) { 102 | location.replace(data.links.href); 103 | } 104 | });'; 105 | } 106 | 107 | /** 108 | * get script 109 | * 110 | * @return null 111 | */ 112 | public function getScript() 113 | { 114 | return null; 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /components/ToggleMenus/Shares/CopyItem.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | 15 | namespace Xpressengine\Plugins\Board\Components\ToggleMenus\Shares; 16 | 17 | use Xpressengine\ToggleMenu\AbstractToggleMenu; 18 | 19 | /** 20 | * CopyItem 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class CopyItem extends AbstractToggleMenu 30 | { 31 | 32 | /** 33 | * 메뉴에서 보여질 문자열 34 | * 35 | * @return string 36 | */ 37 | public function getText() 38 | { 39 | return xe_trans('board::permalink'); 40 | } 41 | 42 | /** 43 | * 메뉴의 타입 44 | * 'exec' or 'link' or 'raw' 중에 하나 45 | * 46 | * @return string 47 | */ 48 | public function getType() 49 | { 50 | return static::MENUTYPE_RAW; 51 | } 52 | 53 | /** 54 | * 실행되기 위한 js 문자열 55 | * 타입이 'raw' 인 경우에는 html 56 | * 57 | * @return string 58 | */ 59 | public function getAction() 60 | { 61 | $url = app('request')->get('url'); 62 | return ''; 64 | } 65 | 66 | /** 67 | * 별도의 js 파일을 load 해야 하는 경우 해당 파일의 경로 68 | * 없는 경우 null 반환 69 | * 70 | * @return string|null 71 | */ 72 | public function getScript() 73 | { 74 | return null; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /components/ToggleMenus/Shares/FacebookItem.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | 15 | namespace Xpressengine\Plugins\Board\Components\ToggleMenus\Shares; 16 | 17 | use Xpressengine\ToggleMenu\AbstractToggleMenu; 18 | 19 | /** 20 | * FacebookItem 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class FacebookItem extends AbstractToggleMenu 30 | { 31 | 32 | /** 33 | * 메뉴에서 보여질 문자열 34 | * 35 | * @return string 36 | */ 37 | public function getText() 38 | { 39 | return xe_trans('board::facebook'); 40 | } 41 | 42 | /** 43 | * 메뉴의 타입 44 | * 'exec' or 'link' or 'raw' 중에 하나 45 | * 46 | * @return string 47 | */ 48 | public function getType() 49 | { 50 | return static::MENUTYPE_RAW; 51 | } 52 | 53 | /** 54 | * 실행되기 위한 js 문자열 55 | * 타입이 'raw' 인 경우에는 html 56 | * 57 | * @return string 58 | */ 59 | public function getAction() 60 | { 61 | $url = 'http://www.facebook.com/sharer/sharer.php?u=' . urlencode(app('request')->get('url')); 62 | return ''; 64 | } 65 | 66 | /** 67 | * 별도의 js 파일을 load 해야 하는 경우 해당 파일의 경로 68 | * 없는 경우 null 반환 69 | * 70 | * @return string|null 71 | */ 72 | public function getScript() 73 | { 74 | return null; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /components/ToggleMenus/Shares/LineItem.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | 15 | namespace Xpressengine\Plugins\Board\Components\ToggleMenus\Shares; 16 | 17 | use Xpressengine\ToggleMenu\AbstractToggleMenu; 18 | 19 | /** 20 | * LineItem 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class LineItem extends AbstractToggleMenu 30 | { 31 | /** 32 | * 메뉴에서 보여질 문자열 33 | * 34 | * @return string 35 | */ 36 | public function getText() 37 | { 38 | return xe_trans('board::line'); 39 | } 40 | 41 | /** 42 | * 메뉴의 타입 43 | * 'exec' or 'link' or 'raw' 중에 하나 44 | * 45 | * @return string 46 | */ 47 | public function getType() 48 | { 49 | return static::MENUTYPE_RAW; 50 | } 51 | 52 | /** 53 | * 실행되기 위한 js 문자열 54 | * 타입이 'raw' 인 경우에는 html 55 | * 56 | * @return string 57 | */ 58 | public function getAction() 59 | { 60 | $url = 'http://line.me/R/msg/text/?title=' . urlencode(app('request')->get('url')); 61 | return ''; 63 | } 64 | 65 | /** 66 | * 별도의 js 파일을 load 해야 하는 경우 해당 파일의 경로 67 | * 없는 경우 null 반환 68 | * 69 | * @return string|null 70 | */ 71 | public function getScript() 72 | { 73 | return null; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /components/ToggleMenus/Shares/TwitterItem.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | 15 | namespace Xpressengine\Plugins\Board\Components\ToggleMenus\Shares; 16 | 17 | use Xpressengine\ToggleMenu\AbstractToggleMenu; 18 | 19 | /** 20 | * TwitterItem 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class TwitterItem extends AbstractToggleMenu 30 | { 31 | 32 | /** 33 | * 메뉴에서 보여질 문자열 34 | * 35 | * @return string 36 | */ 37 | public function getText() 38 | { 39 | return xe_trans('board::twitter'); 40 | } 41 | 42 | /** 43 | * 메뉴의 타입 44 | * 'exec' or 'link' or 'raw' 중에 하나 45 | * 46 | * @return string 47 | */ 48 | public function getType() 49 | { 50 | return static::MENUTYPE_RAW; 51 | } 52 | 53 | /** 54 | * 실행되기 위한 js 문자열 55 | * 타입이 'raw' 인 경우에는 html 56 | * 57 | * @return string 58 | */ 59 | public function getAction() 60 | { 61 | $url = 'https://twitter.com/intent/tweet?url=' . urlencode(app('request')->get('url')); 62 | return ''; 64 | } 65 | 66 | /** 67 | * 별도의 js 파일을 load 해야 하는 경우 해당 파일의 경로 68 | * 없는 경우 null 반환 69 | * 70 | * @return string|null 71 | */ 72 | public function getScript() 73 | { 74 | return null; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /components/UIObjects/DesignSelect/designSelectItem.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Xpressengine\Plugins\Board\Components\UIObjects\DesignSelect\DesignSelectUIObject; 3 | @endphp 4 | 5 | @if(isset($items) && is_array($items) && count($items)) 6 |
      7 | @foreach ($items as $item) 8 |
    • 9 | {{ xe_trans($item['text']) }} 10 | @if (DesignSelectUIObject::hasChildren($item)) 11 | {!! DesignSelectUIObject::renderList(DesignSelectUIObject::getChildren($item), $selectedItemValue) !!} 12 | @endif 13 |
    • 14 | @endforeach 15 |
    16 | @endif 17 | -------------------------------------------------------------------------------- /components/UIObjects/NewSelect/assets/css/newSelectStyle.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | .new-select { 3 | white-space: normal; 4 | } 5 | 6 | .new-select .xe-dropdown__button .xe-dropdown__button-box { 7 | position: relative; 8 | } 9 | 10 | .new-select .xe-dropdown__button .xe-dropdown--menu { 11 | z-index: 5; 12 | display: none; 13 | border: 1px solid #d4d5dc; 14 | border-radius: 3px; 15 | background: #fff; 16 | position: absolute; 17 | padding: 10px 0; 18 | overflow: hidden; 19 | } 20 | 21 | .new-select .xe-dropdown__button .xe-dropdown__button-box .xe-dropdown__button-text { 22 | background: transparent; 23 | border: none; 24 | margin: 0; 25 | padding: 0; 26 | color: #767676; 27 | font-size: 14px; 28 | } 29 | 30 | .new-select .xe-dropdown__button .xe-dropdown__button-box .xe-dropdown__button-text:after { 31 | display: inline-block; 32 | font-family: xeicon !important; 33 | content: "\e943"; 34 | margin-right: 5px; 35 | } 36 | 37 | 38 | .new-select .xe-dropdown__button .xe-dropdown--menu.open { 39 | display: block; 40 | } 41 | 42 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--menu-item { 43 | position: relative; 44 | font-size:14px; 45 | } 46 | 47 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--menu-item.on { 48 | color: #fff; 49 | } 50 | 51 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--menu-item .xe-dropdown--menu-item-link:focus:after { 52 | content:''; 53 | position: absolute; 54 | top: 0; 55 | bottom: 0; 56 | width: 100vw; 57 | background: #f5f5f5; 58 | padding-right: 20px; 59 | left: -100%; 60 | z-index: -1; 61 | } 62 | 63 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--menu-item:hover:after { 64 | content:''; 65 | position: absolute; 66 | top: 0; 67 | bottom: 0; 68 | width: 100vw; 69 | background: #f5f5f5; 70 | padding-right: 20px; 71 | left: -100%; 72 | z-index: -1; 73 | } 74 | 75 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--menu-item.on:after { 76 | content:''; 77 | position: absolute; 78 | top: 0; 79 | bottom: 0; 80 | width: 100vw; 81 | background: #141414; 82 | left: -100%; 83 | z-index: -1; 84 | } 85 | 86 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--menu-item.on:after a{ 87 | color: #fff; 88 | } 89 | 90 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--sub-menu { 91 | padding-left: 10px; 92 | } 93 | 94 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--menu-item-link { 95 | text-decoration: none; 96 | color: #141414; 97 | padding: 5px 10px; 98 | display: inline-block; 99 | min-width: 150px; 100 | max-width: 500px; 101 | font-size: 14px; 102 | } 103 | 104 | 105 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--menu-item.on .xe-dropdown--menu-item-link { 106 | color: #fff; 107 | } 108 | 109 | .new-select .xe-dropdown__button .xe-dropdown--menu .xe-dropdown--sub-menu .xe-dropdown--menu-item-link:before { 110 | content: '└ '; 111 | } 112 | -------------------------------------------------------------------------------- /components/UIObjects/NewSelect/assets/js/newSelect.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $('.xe-dropdown--menu-item').on('click', function (e) { 3 | e.preventDefault() 4 | 5 | var $this = $(this) 6 | var $container = $(this).closest('.new-select') 7 | var $parent = $(this).closest('.xe-dropdown__button') 8 | var name = $(this).closest('.xe-dropdown--menu').data('name') 9 | var $nameInput = $container.find('[name=' + name + ']') 10 | 11 | $parent.find('.xe-dropdown--menu-item').removeClass('on') 12 | $this.addClass('on') 13 | $nameInput.val($this.data('value')) 14 | $container.find('button').text($this.text()) 15 | 16 | $nameInput.trigger('change') 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /components/UIObjects/NewSelect/newSelect.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Xpressengine\Plugins\Board\Components\UIObjects\NewSelect\NewSelectUIObject; 3 | @endphp 4 | 5 |
    6 | 7 |
    8 |
    9 | 14 |
    15 |
    16 | 21 | {!! NewSelectUIObject::renderList($items, $value) !!} 22 |
    23 |
    24 |
    25 | -------------------------------------------------------------------------------- /components/UIObjects/NewSelect/newSelectItem.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Xpressengine\Plugins\Board\Components\UIObjects\NewSelect\NewSelectUIObject; 3 | @endphp 4 | 5 | @if(isset($items) && is_array($items) && count($items)) 6 | @foreach ($items as $item) 7 | 10 |
    11 | @if (NewSelectUIObject::hasChildren($item)) 12 | {!! NewSelectUIObject::renderList(NewSelectUIObject::getChildren($item), $selectedItemValue) !!} 13 | @endif 14 |
    15 | @endforeach 16 | @endif -------------------------------------------------------------------------------- /components/UIObjects/NewTitle/NewTitleUIObject.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2020 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | 15 | namespace Xpressengine\Plugins\Board\Components\UIObjects\NewTitle; 16 | 17 | use View; 18 | use XeFrontend; 19 | use Xpressengine\UIObject\AbstractUIObject; 20 | 21 | /** 22 | * NewTitle 23 | * 24 | * 신규 게시판 스킨에서 게시판 글 등록할 때 slug 지원하는 input box 25 | * 26 | * @category Board 27 | * @package Xpressengine\Plugins\Board 28 | * @author XE Developers 29 | * @copyright 2020 Copyright XEHub Corp. 30 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 31 | * @link https://xpressengine.io 32 | */ 33 | class NewTitleUIObject extends AbstractUIObject 34 | { 35 | /** 36 | * @var bool 37 | */ 38 | protected static $loaded = false; 39 | 40 | /** 41 | * @var string 42 | */ 43 | protected static $id = 'uiobject/board@new_title'; 44 | 45 | /** 46 | * render 47 | * 48 | * @return \Illuminate\Contracts\View\View 49 | */ 50 | public function render() 51 | { 52 | $args = $this->arguments; 53 | 54 | if (empty($args['id'])) { 55 | $args['id'] = ''; 56 | } 57 | 58 | if (empty($args['slug'])) { 59 | $args['slug'] = ''; 60 | } 61 | 62 | if (empty($args['slugDomName'])) { 63 | $args['slugDomName'] = 'slug'; 64 | } 65 | if (empty($args['titleDomName'])) { 66 | $args['titleDomName'] = 'title'; 67 | } 68 | 69 | if (empty($args['titleClassName'])) { 70 | $args['titleClassName'] = 'xe-form-control title'; 71 | } 72 | 73 | $args['scriptInit'] = false; 74 | if (self::$loaded === false) { 75 | self::$loaded = true; 76 | 77 | $args['scriptInit'] = true; 78 | 79 | // XeFrontend::js('plugins/board/components/UIObjects/NewTitle/assets/js/newTitle.js')->load(); 80 | } 81 | 82 | return View::make('board::components/UIObjects/NewTitle/title', $args)->render(); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /components/UIObjects/Share/ShareUIObject.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Components\UIObjects\Share; 15 | 16 | use App\Facades\XeFrontend; 17 | use Xpressengine\UIObject\AbstractUIObject; 18 | use View; 19 | use Route; 20 | use XeConfig; 21 | 22 | /** 23 | * Share 24 | * 25 | * @category Board 26 | * @package Xpressengine\Plugins\Board 27 | * @author XE Developers 28 | * @copyright 2019 Copyright XEHub Corp. 29 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 30 | * @link https://xpressengine.io 31 | */ 32 | class ShareUIObject extends AbstractUIObject 33 | { 34 | protected static $loaded = false; 35 | 36 | protected static $id = 'uiobject/board@share'; 37 | 38 | /** 39 | * 40 | */ 41 | const CONFIG_NAME = 'uiobject/board@share'; 42 | 43 | /** 44 | * boot 45 | * 46 | * @return void 47 | */ 48 | public static function boot() 49 | { 50 | self::registerSettingsRoute(); 51 | } 52 | 53 | /** 54 | * Register Plugin Manage Route 55 | * 56 | * @return void 57 | */ 58 | protected static function registerSettingsRoute() 59 | { 60 | Route::settings(self::getId(), function () { 61 | Route::get( 62 | '/config', 63 | ['as' => 'settings.board.share.config', 'uses' => 'ShareSettingsController@config'] 64 | ); 65 | }, ['namespace' => 'Xpressengine\Plugins\Board\Controllers']); 66 | } 67 | 68 | /** 69 | * render 70 | * 71 | * @return mixed 72 | */ 73 | public function render() 74 | { 75 | if (self::$loaded === false) { 76 | self::$loaded = true; 77 | XeFrontend::js('/plugins/board/components/UIObjects/Share/assets/share.js')->load(); 78 | } 79 | 80 | $args = $this->arguments; 81 | 82 | $item = $args['item']; 83 | $url = $args['url']; 84 | $className = (isset($args['className'])) ? $args['className'] : ''; 85 | 86 | 87 | return View::make('board::components/UIObjects/Share/share', [ 88 | 'url' => $url, 89 | 'item' => $item, 90 | 'className' => $className 91 | ])->render(); 92 | } 93 | 94 | /** 95 | * get manage URI 96 | * 97 | * @return string 98 | */ 99 | public static function getSettingsURI() 100 | { 101 | return route('settings.board.share.config'); 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /components/UIObjects/Share/assets/share.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | if (BoardShare == undefined) { 3 | var BoardShare = { 4 | init: function () { 5 | $('body').on('click', '.xe-toggle-menu .share-item', function (event) { 6 | event.preventDefault() 7 | 8 | var $target = $(event.target), 9 | $anchor = $target.closest('a') 10 | if ($anchor.data('type') == 'copy') { 11 | BoardShare.copyToClipboard($anchor.data('url')) 12 | XE.toast('info', 'Complete') 13 | } else { 14 | window.open($anchor.data('url')) 15 | } 16 | }) 17 | }, 18 | copyToClipboard: function (text) { 19 | if (window.clipboardData && window.clipboardData.setData) { 20 | // IE specific code path to prevent textarea being shown while dialog is visible. 21 | return clipboardData.setData('Text', text) 22 | } else if (document.queryCommandSupported && document.queryCommandSupported('copy')) { 23 | var textarea = document.createElement('textarea') 24 | textarea.textContent = text 25 | textarea.style.position = 'fixed' // Prevent scrolling to bottom of page in MS Edge. 26 | document.body.appendChild(textarea) 27 | textarea.select() 28 | try { 29 | return document.execCommand('copy') // Security exception may be thrown by some browsers. 30 | } catch (ex) { 31 | console.warn('Copy to clipboard failed.', ex) 32 | return false 33 | } finally { 34 | document.body.removeChild(textarea) 35 | } 36 | } 37 | }, 38 | searchToObject: function () { 39 | return search.substring(1).split('&').reduce(function (result, value) { 40 | var parts = value.split('=') 41 | if (parts[0]) result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]) 42 | return result 43 | }, {}) 44 | } 45 | } 46 | } 47 | 48 | $(function () { 49 | BoardShare.init() 50 | }) 51 | })(window.jQuery) 52 | -------------------------------------------------------------------------------- /components/UIObjects/Share/setting.blade.php: -------------------------------------------------------------------------------- 1 | @section('page_title') 2 |

    Share

    3 | @endsection 4 | 5 | 6 |
    7 |
    8 |
    9 |
    10 |
    11 |
    12 |

    {{xe_trans('xe::toggleMenu')}}

    13 |
    14 |
    15 |
    16 |
    17 | {!! $toggleMenuSection !!} 18 |
    19 |
    20 |
    21 | 22 |
    23 |
    24 |
    -------------------------------------------------------------------------------- /components/UIObjects/Share/share.blade.php: -------------------------------------------------------------------------------- 1 | $item->id, 'type'=>'uiobject/board@share', 'instanceId'=>$item->instance_id, 'url'=>$url]) !!}' 7 | data-side="dropdown-menu-right"> 8 | {{ xe_trans('board::share') }} 9 | 10 | 11 | 23 | -------------------------------------------------------------------------------- /components/UIObjects/Tag/TagUIObject.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Components\UIObjects\Tag; 15 | 16 | use Xpressengine\UIObject\AbstractUIObject; 17 | use View; 18 | use XePlugin; 19 | 20 | /** 21 | * Tag 22 | * 23 | * 게시판 글 등록할 때 slug 지원하는 input box 24 | * 25 | * @category Board 26 | * @package Xpressengine\Plugins\Board 27 | * @author XE Developers 28 | * @copyright 2019 Copyright XEHub Corp. 29 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 30 | * @link https://xpressengine.io 31 | */ 32 | class TagUIObject extends AbstractUIObject 33 | { 34 | /** 35 | * @var bool 36 | */ 37 | protected static $loaded = false; 38 | 39 | /** 40 | * @var string 41 | */ 42 | protected static $id = 'uiobject/board@tag'; 43 | 44 | /** 45 | * render 46 | * 47 | * @return \Illuminate\Contracts\View\View 48 | */ 49 | public function render() 50 | { 51 | $args = $this->arguments; 52 | 53 | if (empty($args['tags'])) { 54 | $args['tags'] = []; 55 | } 56 | 57 | $args['strTags'] = ''; 58 | if (is_array($args['tags']) && count($args['tags']) > 0) { 59 | $tagWords = []; 60 | foreach ($args['tags'] as $tag) { 61 | $tagWords[] = $tag['word']; 62 | } 63 | $args['strTags'] = sprintf('["%s"]', implode('","', $tagWords)); 64 | } 65 | 66 | 67 | if (empty($args['id'])) { 68 | $args['id'] = 'xeBoardTagWrap'; 69 | } 70 | if (empty($args['titleDomName'])) { 71 | $args['titleDomName'] = 'Tag'; 72 | } 73 | 74 | if (empty($args['class'])) { 75 | $args['class'] = 'xe-select-label __xe-board-tag'; 76 | } 77 | 78 | if (empty($args['placeholder'])) { 79 | $args['placeholder'] = xe_trans('board::inputTag'); 80 | } 81 | 82 | if (empty($args['url'])) { 83 | $args['url'] = '/editor/hashTag'; 84 | } 85 | 86 | $args['scriptInit'] = false; 87 | if (self::$loaded === false) { 88 | self::$loaded = true; 89 | 90 | $args['scriptInit'] = true; 91 | } 92 | 93 | $plugin = XePlugin::getPlugin('board'); 94 | return View::make('board::components/UIObjects/Tag/tag', $args)->render(); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /components/UIObjects/Tag/tag.blade.php: -------------------------------------------------------------------------------- 1 | @if ($scriptInit) 2 | {{ XeFrontend::js('plugins/board/assets/js/BoardTags.js')->appendTo('body')->load() }} 3 | @endif 4 | 5 |
    6 | 7 |
    8 | 9 | 43 | -------------------------------------------------------------------------------- /components/UIObjects/Title/TitleUIObject.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Components\UIObjects\Title; 15 | 16 | use Xpressengine\UIObject\AbstractUIObject; 17 | use View; 18 | use XePlugin; 19 | 20 | /** 21 | * Title 22 | * 23 | * 게시판 글 등록할 때 slug 지원하는 input box 24 | * 25 | * @category Board 26 | * @package Xpressengine\Plugins\Board 27 | * @author XE Developers 28 | * @copyright 2019 Copyright XEHub Corp. 29 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 30 | * @link https://xpressengine.io 31 | */ 32 | class TitleUIObject extends AbstractUIObject 33 | { 34 | /** 35 | * @var bool 36 | */ 37 | protected static $loaded = false; 38 | 39 | /** 40 | * @var string 41 | */ 42 | protected static $id = 'uiobject/board@title'; 43 | 44 | /** 45 | * render 46 | * 47 | * @return \Illuminate\Contracts\View\View 48 | */ 49 | public function render() 50 | { 51 | $args = $this->arguments; 52 | 53 | if (empty($args['id'])) { 54 | $args['id'] = ''; 55 | } 56 | 57 | if (empty($args['slug'])) { 58 | $args['slug'] = ''; 59 | } 60 | 61 | if (empty($args['slugDomName'])) { 62 | $args['slugDomName'] = 'slug'; 63 | } 64 | if (empty($args['titleDomName'])) { 65 | $args['titleDomName'] = 'title'; 66 | } 67 | 68 | if (empty($args['titleClassName'])) { 69 | $args['titleClassName'] = 'xe-form-control title'; 70 | } 71 | 72 | $args['scriptInit'] = false; 73 | if (self::$loaded === false) { 74 | self::$loaded = true; 75 | 76 | $args['scriptInit'] = true; 77 | } 78 | 79 | $plugin = XePlugin::getPlugin('board'); 80 | return View::make('board::components/UIObjects/Title/title', $args)->render(); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Basic/BasicCardSkin.php: -------------------------------------------------------------------------------- 1 | [ 4 | 'imageWidth' => [ 5 | '_type' => 'text', 6 | 'label' => '이미지 너비(width)' 7 | ], 8 | ], 9 | 'support' => [ 10 | 'mobile' => true, 11 | 'desktop' => true 12 | ] 13 | ]; 14 | -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Basic/info-list.php: -------------------------------------------------------------------------------- 1 | [ 4 | 'mobile' => true, 5 | 'desktop' => true 6 | ] 7 | ]; 8 | -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Basic/views/setting.blade.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/components/Widgets/ArticleList/Skins/Basic/views/setting.blade.php -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Basic/views/widget-card.blade.php: -------------------------------------------------------------------------------- 1 | {{ app('xe.frontend')->css([ 2 | $_skin::asset('css/widget-basic.css') 3 | ])->load() }} 4 | 5 |
    6 |
    7 |
    8 | 9 |

    {{ $widgetConfig['@attributes']['title'] }}

    10 | 11 | @if ($more) 12 | @php 13 | $instanceId = $menuItem->id; 14 | $urlMore = instance_route('index', [], $instanceId); 15 | if (starts_with($widgetConfig['board_id'], 'category.')) { 16 | $categoryId = str_after($widgetConfig['board_id'], 'category.'); 17 | $urlMore = instance_route('index', ['category_item_id' => $categoryId], $instanceId); 18 | } 19 | @endphp 20 | 21 | 22 | 전체보기 23 | 24 | @endif 25 |
    26 | 27 | 48 |
    49 |
    50 | -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Basic/views/widget-list.blade.php: -------------------------------------------------------------------------------- 1 | {{ app('xe.frontend')->css([ 2 | $_skin::asset('css/widget-basic.css') 3 | ])->load() }} 4 | 5 |
    6 |
    7 |
    8 | 9 |

    {{ $widgetConfig['@attributes']['title'] }}

    10 | 11 | @if ($more) 12 | @php 13 | $instanceId = $menuItem->id; 14 | $urlMore = instance_route('index', [], $instanceId); 15 | if (starts_with($widgetConfig['board_id'], 'category.')) { 16 | $categoryId = str_after($widgetConfig['board_id'], 'category.'); 17 | $urlMore = instance_route('index', ['category_item_id' => $categoryId], $instanceId); 18 | } 19 | @endphp 20 | 21 | 22 | 전체보기 23 | 24 | @endif 25 |
    26 | 27 |
    28 | 29 | 41 |
    42 |
    43 |
    44 | -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Common/CommonSkin.php: -------------------------------------------------------------------------------- 1 | $args 25 | ]); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Common/views/setting.blade.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/components/Widgets/ArticleList/Skins/Common/views/setting.blade.php -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Common/views/widget.blade.php: -------------------------------------------------------------------------------- 1 | {{ XeFrontend::css('plugins/board/assets/css/widget.list.css')->load() }} 2 |
    3 |

    4 | {{$title}} 5 |

    6 | @if($more) 7 | {{xe_trans('more')}} 8 | @endif 9 | 10 |
    11 | 12 | 13 | 14 | @foreach ($list as $item) 15 | 16 | 17 | 22 | 28 | 31 | 32 | @endforeach 33 | 34 |
    {{$title}}
    18 | @if ($item->boardConfig->get('category') == true && $item->boardCategory !== null) 19 | {{xe_trans($item->boardCategory->categoryItem->word)}} 20 | @endif 21 | 23 | 24 | {!! $item->title !!} 25 |

    {{$item->pure_content}}

    26 |
    27 |
    29 | {{$item->created_at}} 30 |
    35 | @if($more) 36 | {{xe_trans('more')}} 37 | @endif 38 |
    39 |
    40 | -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Gallery/views/setting.blade.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/components/Widgets/ArticleList/Skins/Gallery/views/setting.blade.php -------------------------------------------------------------------------------- /components/Widgets/ArticleList/Skins/Gallery/views/widget.blade.php: -------------------------------------------------------------------------------- 1 | {{ XeFrontend::css('plugins/board/assets/css/widget.gallery.css')->load() }} 2 | 35 | -------------------------------------------------------------------------------- /components/Widgets/ArticleList/views/category.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @foreach($category['children'] as $child) 3 | @include('board::components.Widgets.ArticleList.views.category', ['category'=>$child,'depth'=>$depth+1]) 4 | @endforeach 5 | -------------------------------------------------------------------------------- /components/Widgets/ArticleList/views/setting.blade.php: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 8 |
    9 | 10 |
    11 | 12 | 13 |
    14 | 15 |
    16 | 17 |
    18 | 23 |
    24 |
    25 | 26 |
    27 | 28 | 33 |
    34 | 35 |

    글 설정

    36 |
    37 | 38 |
    39 | 40 | 48 |
    49 | 50 |
    51 | 52 | 53 |
    54 | 55 | 68 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/icon.png -------------------------------------------------------------------------------- /markup/new_skin/layout/_dropdown-order.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 5 |
    6 | 17 |
    18 |
    19 | -------------------------------------------------------------------------------- /markup/new_skin/layout/_footer.html: -------------------------------------------------------------------------------- 1 | 12 | 13 |
    14 |
      15 |
    • 16 |
    • 1
    • 17 |
    • 2
    • 18 |
    • 3
    • 19 |
    • 4
    • 20 |
    • 5
    • 21 |
    • 6
    • 22 |
    • 7
    • 23 |
    • 8
    • 24 |
    • 9
    • 25 |
    • 10
    • 26 |
    • 27 |
    28 |
    29 | 30 | 31 | 32 |
    33 |
      34 |
    • 35 | 36 |
    • 37 |
    • 38 | 1 / 10 39 |
    • 40 |
    • 41 | 42 |
    • 43 |
    44 |
    45 | 48 | -------------------------------------------------------------------------------- /markup/new_skin/layout/_pagination.html: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
      4 |
    • 5 |
    • 1
    • 6 |
    • 2
    • 7 |
    • 3
    • 8 |
    • 4
    • 9 |
    • 5
    • 10 |
    • 6
    • 11 |
    • 7
    • 12 |
    • 8
    • 13 |
    • 9
    • 14 |
    • 10
    • 15 |
    • 16 |
    17 |
    18 | 19 | 20 | 21 |
    22 |
      23 |
    • 24 | 25 |
    • 26 |
    • 27 | 1 / 10 28 |
    • 29 |
    • 30 | 31 |
    • 32 |
    33 |
    -------------------------------------------------------------------------------- /markup/new_skin/layout/new-board-comment.html: -------------------------------------------------------------------------------- 1 | f -------------------------------------------------------------------------------- /markup/new_skin/layout/new-board-show.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/markup/new_skin/layout/new-board-show.html -------------------------------------------------------------------------------- /markup/new_skin/src/layout/_dropdown-order.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | 5 |
    6 | 17 |
    18 |
    19 | -------------------------------------------------------------------------------- /markup/new_skin/src/layout/_footer.html: -------------------------------------------------------------------------------- 1 | 12 | 13 | 16 | -------------------------------------------------------------------------------- /markup/new_skin/src/layout/_header.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |

    New Theme

    5 | (62) 6 |
    7 |
    8 | 9 |
    10 |
    11 |
    상단 공통내용을 사용하여 글을 입력하였을 경우 이영역을 사용하게 됩니다. 영역은 100%를 활용하며 게시판 설정에서 사용여부를 통해 사용할 수 있습니다.
    12 |
    13 | 14 |
    15 | 40 |
    -------------------------------------------------------------------------------- /markup/new_skin/src/layout/_pagination.html: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
      4 |
    • 5 |
    • 1
    • 6 |
    • 2
    • 7 |
    • 3
    • 8 |
    • 4
    • 9 |
    • 5
    • 10 |
    • 6
    • 11 |
    • 7
    • 12 |
    • 8
    • 13 |
    • 9
    • 14 |
    • 10
    • 15 |
    • 16 |
    17 |
    18 | 19 | 20 | 21 |
    22 |
      23 |
    • 24 | 25 |
    • 26 |
    • 27 | 1 / 10 28 |
    • 29 |
    • 30 | 31 |
    • 32 |
    33 |
    -------------------------------------------------------------------------------- /markup/new_skin/src/new-board-search.html: -------------------------------------------------------------------------------- 1 | 2 | 웹진형 - 3 | 4 |
    5 | 등록된 게시물이 없습니다. 6 |
    7 |
    8 |
    9 | -------------------------------------------------------------------------------- /markup/sample/@iu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/markup/sample/@iu.jpg -------------------------------------------------------------------------------- /markup/sample/markup_test.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | 3 | $(".bd_sorting").on("click", function(e){ 4 | $(this).toggleClass("on"); 5 | if($(this).hasClass("on")){ 6 | $(".board-sorting-area").removeClass("xe-hidden-xs"); 7 | $(".board .bd_dimmed").show(); 8 | } else{ 9 | $(".board-sorting-area").addClass("xe-hidden-xs"); 10 | $(".board .bd_dimmed").hide(); 11 | } 12 | return false; 13 | }); 14 | 15 | $(".bd_manage").on("click", function(e){ 16 | $(this).toggleClass("on"); 17 | if($(this).hasClass("on")){ 18 | $(".bd_manage_detail").show(); 19 | } else{ 20 | $(".bd_manage_detail").hide(); 21 | } 22 | return false; 23 | }); 24 | 25 | $(".bd_select").on("click", function(e){ 26 | $(this).parent().toggleClass("on"); 27 | $(this).toggleClass("on"); 28 | return false; 29 | }); 30 | 31 | $(".bd_search").on("click", function(e){ 32 | $(this).toggleClass("on"); 33 | 34 | if($(this).hasClass("on")){ 35 | $(".bd_search_area").show(); 36 | $(".bd_search_input").focus(); 37 | } else{ 38 | $(".bd_search_area").hide(); 39 | } 40 | 41 | $(".bd_btn_detail").on("click", function(e){ 42 | $(this).toggleClass("on"); 43 | if($(this).hasClass("on")){ 44 | $(".bd_search_detail").show(); 45 | } else{ 46 | $(".bd_search_detail").hide(); 47 | } 48 | return false; 49 | }); 50 | return false; 51 | }); 52 | 53 | $(".read_header .mb_autohr, .bd_like, .bd_favorite, .bd_btn_file, .bd_share, .bd_more_view, .bd_like_num, .btn_file, .like_num, .like, .share, .reply, .comment_more_view, .author, .mb_autohr, .comment_modify").on("click", function(e){ 54 | 55 | $(this).toggleClass("on"); 56 | if($(this).hasClass("bd_like_num")){ 57 | $(".bd_like_more").toggle(); 58 | } 59 | 60 | if($(this).hasClass("like_num")){ 61 | $(this).parent().parent().find(".vote_list").toggle(); 62 | } 63 | 64 | if($(this).hasClass("reply")){ 65 | var el = $(this).parent().parent().find(".comment_action_area"); 66 | var el2 = $(this).parent().parent().find(".comment_action_area.modify"); 67 | el.toggle(); 68 | el2.toggle(); 69 | } 70 | 71 | if($(this).hasClass("comment_modify")){ 72 | $(this).parent().parent().parent().find(".comment_action_area.modify, .xe_content, .comment_action").toggle(); 73 | } 74 | 75 | if($(this).hasClass("temp_save_num")){ 76 | $(".temp_save_list").toggle(); 77 | } 78 | 79 | return false; 80 | }); 81 | 82 | }) 83 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "test": "echo \"Error: no test specified\" && exit 1", 5 | "build": "./node_modules/webpack/bin/webpack.js -p", 6 | "watch": "./node_modules/webpack/bin/webpack.js --watch", 7 | "eslint": "./node_modules/eslint/bin/eslint.js ./assets/js/src", 8 | "eslint-fix": "./node_modules/eslint/bin/eslint.js --fix ./assets/js/src" 9 | }, 10 | "dependencies": { 11 | "@johmun/vue-tags-input": "^2.1.0", 12 | "copy-webpack-plugin": "^4.6.0", 13 | "gulp": "^4.0.2" 14 | }, 15 | "devDependencies": { 16 | "babel-cli": "^6.26.0", 17 | "babel-core": "^6.26.3", 18 | "babel-loader": "^7.1.4", 19 | "babel-preset-env": "^1.6.1", 20 | "babel-register": "^6.26.0", 21 | "eslint": "^4.19.1", 22 | "eslint-config-standard": "^11.0.0", 23 | "eslint-plugin-import": "^2.20.1", 24 | "eslint-plugin-promise": "^3.8.0", 25 | "eslint-plugin-standard": "^3.1.0", 26 | "path": "^0.12.7", 27 | "vue": "^2.6.11", 28 | "vue-html-loader": "^1.2.4", 29 | "vue-loader": "^14.2.4", 30 | "vue-template-compiler": "^2.6.11", 31 | "webpack": "^3.12.0" 32 | }, 33 | "eslintConfig": { 34 | "extends": "standard", 35 | "env": { 36 | "browser": true, 37 | "node": true, 38 | "jquery": true 39 | }, 40 | "globals": {} 41 | }, 42 | "eslintIgnore": [ 43 | "./board.js", 44 | "./BoardTags.js", 45 | "tests/" 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/phpunit.xml -------------------------------------------------------------------------------- /plugin.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | 15 | namespace Xpressengine\Plugins\Board; 16 | 17 | use Xpressengine\Plugin\AbstractPlugin; 18 | use Xpressengine\Plugins\Board\Plugin\Database; 19 | use Xpressengine\Plugins\Board\Plugin\Resources; 20 | use Xpressengine\Plugins\Board\Plugin\Update; 21 | 22 | /** 23 | * Plugin 24 | * 25 | * @category Board 26 | * @package Xpressengine\Plugins\Board 27 | */ 28 | class Plugin extends AbstractPlugin 29 | { 30 | /** 31 | * boot 32 | * 33 | * @return void 34 | */ 35 | public function boot() 36 | { 37 | Resources::bindClasses(); 38 | Resources::registerTitleWithSlug(); 39 | Resources::registerRecycleBin(); 40 | Resources::registerCommands(); 41 | Resources::setDefaultSkin(); 42 | Resources::interceptDynamicField(); 43 | Resources::interceptDeleteCategory(); 44 | 45 | Resources::listenCommentRetrievedEvent(); 46 | Resources::listenCommentCreateEvent(); 47 | } 48 | 49 | /** 50 | * activate 51 | * 52 | * @param null $installedVersion installed version 53 | * @return void 54 | */ 55 | public function activate($installedVersion = null) 56 | { 57 | } 58 | 59 | /**install 60 | * 61 | * @return void 62 | */ 63 | public function install() 64 | { 65 | Database::create(); 66 | 67 | Resources::createDefaultConfig(); 68 | Resources::createShareConfig(); 69 | Resources::putLang(); 70 | } 71 | 72 | /** 73 | * update 74 | * 75 | * @param null $installedVersion install version 76 | * @return void 77 | */ 78 | public function update($installedVersion = null) 79 | { 80 | Update::proc($installedVersion); 81 | } 82 | 83 | /** 84 | * check update 85 | * 86 | * @param null $installedVersion 87 | * @return bool 88 | */ 89 | public function checkUpdated($installedVersion = NULL) 90 | { 91 | return Update::check($installedVersion); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /samples/.gitignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | -------------------------------------------------------------------------------- /samples/board_flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/samples/board_flat.png -------------------------------------------------------------------------------- /src/BoardException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board; 15 | 16 | use Xpressengine\Support\Exceptions\XpressengineException; 17 | 18 | /** 19 | * BoardException 20 | * 21 | * @category Board 22 | * @package Xpressengine\Plugins\Board 23 | * @author XE Developers 24 | * @copyright 2019 Copyright XEHub Corp. 25 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 26 | * @link https://xpressengine.io 27 | */ 28 | class BoardException extends XpressengineException 29 | { 30 | } 31 | -------------------------------------------------------------------------------- /src/Commands/BoardSkinMake.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Commands; 15 | 16 | use App\Console\Commands\SkinMake; 17 | 18 | /** 19 | * BoardSkinMake 20 | * 21 | * @category Board 22 | * @package Xpressengine\Plugins\Board 23 | * @author XE Developers 24 | * @copyright 2019 Copyright XEHub Corp. 25 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 26 | * @link https://xpressengine.io 27 | */ 28 | class BoardSkinMake extends SkinMake 29 | { 30 | protected $signature = 'make:board_skin 31 | {plugin : The plugin where the skin will be located} 32 | {name : The name of skin to create} 33 | 34 | {--id= : The identifier of skin. default "@"} 35 | {--path= : The path of skin. Enter the path to under the plugin. ex) SomeDir/SkinDir} 36 | {--class= : The class name of skin. default "Skin"}'; 37 | 38 | /** 39 | * The console command description. 40 | * 41 | * @var string 42 | */ 43 | protected $description = 'Create a new board skin'; 44 | 45 | /** 46 | * get title 47 | * 48 | * @return string 49 | */ 50 | protected function getTitleInput() 51 | { 52 | return $this->option('title') ?: studly_case($this->getComponentName()) . ' Board skin'; 53 | } 54 | 55 | /** 56 | * get skin target 57 | * 58 | * @return string 59 | */ 60 | protected function getSkinTarget() 61 | { 62 | return 'module/board@board'; 63 | } 64 | 65 | /** 66 | * makeUsable 67 | * 68 | * @param \ArrayAccess|array $attr attributes 69 | * @return void 70 | * @throws \Exception 71 | */ 72 | protected function makeUsable($attr) 73 | { 74 | $plugin = $attr['plugin']; 75 | $path = $plugin->getPath($attr['path']); 76 | 77 | $this->makeSkinClass($attr); 78 | 79 | rename($path.'/info.stub', $path.'/info.php'); 80 | 81 | $viewFileNames = [ 82 | 'create', 'edit', 'guestId', 'index', 'preview', 'revision', 'setting', 83 | 'show', 'votedModal', 'votedUserList', 'votedUsers', 84 | ]; 85 | 86 | $replacePath = $plugin->getId().'/'.$attr['path']; 87 | foreach ($viewFileNames as $fileName) { 88 | $stub = sprintf('%s/views/%s.blade.stub', $path, $fileName); 89 | if (file_exists($stub)) { 90 | $code = $this->files->get($stub); 91 | $code = str_replace('DummyPath', $replacePath, $code); 92 | $this->files->put($stub, $code); 93 | 94 | $rename = sprintf('%s/views/%s.blade.php', $path, $fileName); 95 | rename($stub, $rename); 96 | } 97 | } 98 | } 99 | 100 | /** 101 | * get stub path 102 | * 103 | * @return string 104 | */ 105 | protected function getStubPath() 106 | { 107 | return __DIR__.'/stubs/board_skin'; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/Commands/stubs/board_skin/assets/css/skin.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xpressengine/plugin-board/9ca47af29e441f1ad16ffcb79bdc0bc349c33d57/src/Commands/stubs/board_skin/assets/css/skin.css -------------------------------------------------------------------------------- /src/Commands/stubs/board_skin/info.stub: -------------------------------------------------------------------------------- 1 | [ 4 | 'sample_text' => [ 5 | '_type' => 'text', 6 | '_section' => '기본설정', 7 | 'label' => '샘플 문구', 8 | 'placeholder' => '샘플용 설정 필드입니다.', 9 | 'description' => '샘플용 설정 필드입니다.', 10 | ], 11 | ], 12 | 'support' => [ 13 | 'mobile' => true, 14 | 'desktop' => true 15 | ] 16 | ]; 17 | -------------------------------------------------------------------------------- /src/Commands/stubs/board_skin/skin.stub: -------------------------------------------------------------------------------- 1 | load() }} 2 | 3 | {{ XeFrontend::js('plugins/board/assets/js/board.js')->appendTo('body')->load() }} 4 | 5 | {{ XeFrontend::rule('board', $rules) }} 6 | 7 | {!! XeFrontend::css('assets/core/user/auth.css')->load() !!} 8 |
    9 |

    {{ xe_trans('xe::identification') }}

    10 |
    11 | 12 | 13 | 14 | 15 |
    16 | {{ xe_trans('xe::identification') }} 17 |
    18 | 19 | 20 |
    21 |
    22 | 23 | 24 |
    25 | 26 | 27 |
    28 |
    29 |
    30 | -------------------------------------------------------------------------------- /src/Commands/stubs/board_skin/views/preview.blade.stub: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | @if($showCategoryItem) 4 | {{ xe_trans($showCategoryItem->word) }} 5 | @endif 6 |

    {!! $title !!}

    7 |
    8 | {{ $writer }} 9 | {{$currentDate}} 10 | 0 11 |
    12 |
    13 |
    14 | {!! compile($config->get('boardId'), $content, $format === Xpressengine\Plugins\Board\Models\Board::FORMAT_HTML) !!} 15 |
    16 |
    -------------------------------------------------------------------------------- /src/Commands/stubs/board_skin/views/setting.blade.stub: -------------------------------------------------------------------------------- 1 | {{-- implement it!! --}} 2 | 3 | -------------------------------------------------------------------------------- /src/Commands/stubs/board_skin/views/votedModal.blade.stub: -------------------------------------------------------------------------------- 1 |
    2 | 3 | {{xe_trans('board::assentThisPosts', ['count' => $count])}} 4 |
    5 | 6 |
    7 | 8 | 11 | -------------------------------------------------------------------------------- /src/Commands/stubs/board_skin/views/votedUserList.blade.stub: -------------------------------------------------------------------------------- 1 | @foreach($paginate as $log) 2 | @if($log->user->getId() == Auth::user()->getId()) 3 |
  • 4 | 5 |
    6 | 7 |
    {{$log->user->getDisplayName()}}
    8 |
    9 |

    {{$log->user->getDisplayName()}}

    10 |
    11 |
    12 |
  • 13 | @else 14 |
  • 15 | 16 |
    {{$log->user->getDisplayName()}}
    17 |
    18 |

    {{$log->user->getDisplayName()}}

    19 | {{$log->created_at}} 20 |
    21 |
    22 |
  • 23 | @endif 24 | @endforeach 25 | -------------------------------------------------------------------------------- /src/Commands/stubs/board_skin/views/votedUsers.blade.stub: -------------------------------------------------------------------------------- 1 |
      2 | @foreach ($logs as $log) 3 |
    • user->getId() == Auth::user()->getId()) class="on" @endif>{{$log->user->getDisplayName()}}
    • 4 | @endforeach 5 |
    6 | 7 | @if ($item->assent_count > 10) 8 |

    {!! xe_trans('board::assentThisPostsOthers', [ 9 | 'count'=> sprintf('%s', $urlHandler->get('votedModal', ['option' => $option, 'id' => $item->id]), $item->assent_count - 1), 10 | ]) !!}

    11 | @endif 12 | -------------------------------------------------------------------------------- /src/Controllers/ShareSettingsController.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | 15 | namespace Xpressengine\Plugins\Board\Controllers; 16 | 17 | use App\Http\Controllers\Controller; 18 | use App\Http\Sections\ToggleMenuSection; 19 | use XePresenter; 20 | use XeConfig; 21 | use Xpressengine\Http\Request; 22 | use Xpressengine\Plugins\Board\Components\UIObjects\Share\ShareUIObject; 23 | 24 | /** 25 | * ShareSettingsController 26 | * 27 | * @category Board 28 | * @package Xpressengine\Plugins\Board 29 | * @author XE Developers 30 | * @copyright 2019 Copyright XEHub Corp. 31 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 32 | * @link https://xpressengine.io 33 | */ 34 | class ShareSettingsController extends Controller 35 | { 36 | /** 37 | * config 38 | * 39 | * @return mixed|\Xpressengine\Presenter\Presentable 40 | */ 41 | public function config() 42 | { 43 | $toggleMenuSection = new ToggleMenuSection(ShareUIObject::getId()); 44 | 45 | return XePresenter::make('board::components/UIObjects/Share/setting', [ 46 | 'toggleMenuSection' => $toggleMenuSection, 47 | ]); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/Exceptions/AlreadyExistFavoriteHttpException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\HttpBoardException; 17 | 18 | /** 19 | * AlreadyExistFavoriteHttpException 20 | * 21 | * @category Board 22 | * @package Xpressengine\Plugins\Board 23 | * @author XE Developers 24 | * @copyright 2019 Copyright XEHub Corp. 25 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 26 | * @link https://xpressengine.io 27 | */ 28 | class AlreadyExistFavoriteHttpException extends HttpBoardException 29 | { 30 | protected $message = 'board::favoriteAlreadyExist'; 31 | } 32 | -------------------------------------------------------------------------------- /src/Exceptions/AlreadyExistInstanceException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\BoardException; 17 | 18 | /** 19 | * AlreadyExistsInstanceException 20 | * 21 | * @category Board 22 | * @package Xpressengine\Plugins\Board 23 | * @author XE Developers 24 | * @copyright 2019 Copyright XEHub Corp. 25 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 26 | * @link https://xpressengine.io 27 | */ 28 | class AlreadyExistsInstanceException extends BoardException 29 | { 30 | } 31 | -------------------------------------------------------------------------------- /src/Exceptions/AlreadyUseCategoryHttpException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Illuminate\Http\Response; 17 | use Xpressengine\Plugins\Board\HttpBoardException; 18 | 19 | /** 20 | * AlreadyUseCategoryHttpException 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class AlreadyUseCategoryHttpException extends HttpBoardException 30 | { 31 | /** 32 | * @var string 33 | */ 34 | protected $message = 'board::alreadyUseCategory'; 35 | 36 | /** 37 | * @var int 38 | */ 39 | protected $statusCode = Response::HTTP_NOT_ACCEPTABLE; 40 | } 41 | -------------------------------------------------------------------------------- /src/Exceptions/CaptchaNotVerifiedException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\HttpBoardException; 17 | use Symfony\Component\HttpFoundation\Response; 18 | 19 | /** 20 | * CaptchaNotVerifiedException 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class CaptchaNotVerifiedException extends HttpBoardException 30 | { 31 | protected $message = 'board::CaptchaNotVerified'; 32 | protected $statusCode = Response::HTTP_FORBIDDEN; 33 | } 34 | -------------------------------------------------------------------------------- /src/Exceptions/GuestWrittenSecretDocumentException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\HttpBoardException; 17 | 18 | /** 19 | * GuestWrittenSecretDocument 20 | * 21 | * @category Board 22 | * @package Xpressengine\Plugins\Board 23 | * @author XE Developers 24 | * @copyright 2019 Copyright XEHub Corp. 25 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 26 | * @link https://xpressengine.io 27 | */ 28 | class GuestWrittenSecretDocumentException extends HttpBoardException 29 | { 30 | } 31 | -------------------------------------------------------------------------------- /src/Exceptions/HaveNoWritePermissionHttpException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\HttpBoardException; 17 | use Symfony\Component\HttpFoundation\Response; 18 | 19 | /** 20 | * HaveNoWritePermissionHttpException 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class HaveNoWritePermissionHttpException extends HttpBoardException 30 | { 31 | protected $message = 'board::HaveNoWritePermission'; 32 | } 33 | -------------------------------------------------------------------------------- /src/Exceptions/InvalidConfigException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\BoardException; 17 | 18 | /** 19 | * InvalidConfigException 20 | * 21 | * PHP version 7 22 | * 23 | * @category Board 24 | * @package Xpressengine\Plugins\Board 25 | * @author XE Developers 26 | * @copyright 2019 Copyright XEHub Corp. 27 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 28 | * @link https://xpressengine.io 29 | */ 30 | class InvalidConfigException extends BoardException 31 | { 32 | } 33 | -------------------------------------------------------------------------------- /src/Exceptions/NotFoundConfigHttpException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\HttpBoardException; 17 | use Symfony\Component\HttpFoundation\Response; 18 | 19 | /** 20 | * NotFoundConfigHttpException 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class NotFoundConfigHttpException extends HttpBoardException 30 | { 31 | protected $message = 'xe::NotFoundConfig'; 32 | } 33 | -------------------------------------------------------------------------------- /src/Exceptions/NotFoundDocumentException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\HttpBoardException; 17 | use Symfony\Component\HttpFoundation\Response; 18 | 19 | /** 20 | * NotFoundDocumentException 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class NotFoundDocumentException extends HttpBoardException 30 | { 31 | protected $statusCode = Response::HTTP_GONE; 32 | protected $message = 'board::notFoundDocument'; 33 | } 34 | -------------------------------------------------------------------------------- /src/Exceptions/NotFoundFavoriteHttpException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\HttpBoardException; 17 | 18 | /** 19 | * NotFoundFavoriteHttpException 20 | * 21 | * @category Board 22 | * @package Xpressengine\Plugins\Board 23 | * @author XE Developers 24 | * @copyright 2019 Copyright XEHub Corp. 25 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 26 | * @link https://xpressengine.io 27 | */ 28 | class NotFoundFavoriteHttpException extends HttpBoardException 29 | { 30 | protected $message = 'board::notFoundFavorite'; 31 | } 32 | -------------------------------------------------------------------------------- /src/Exceptions/NotMatchedCertifyKeyException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\HttpBoardException; 17 | use Symfony\Component\HttpFoundation\Response; 18 | 19 | /** 20 | * NotMatchedCertifyKeyException 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class NotMatchedCertifyKeyException extends HttpBoardException 30 | { 31 | protected $message = 'board::notMatchedCertifyKey'; 32 | protected $statusCode = Response::HTTP_UNAUTHORIZED; 33 | } 34 | -------------------------------------------------------------------------------- /src/Exceptions/RequiredBoardIdException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\BoardException; 17 | 18 | /** 19 | * RequiredBoardIdException 20 | * 21 | * PHP version 7 22 | * 23 | * @category Board 24 | * @package Xpressengine\Plugins\Board 25 | * @author XE Developers 26 | * @copyright 2019 Copyright XEHub Corp. 27 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 28 | * @link https://xpressengine.io 29 | */ 30 | class RequiredBoardIdException extends BoardException 31 | { 32 | } 33 | -------------------------------------------------------------------------------- /src/Exceptions/SecretDocumentHttpException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Exceptions; 15 | 16 | use Xpressengine\Plugins\Board\HttpBoardException; 17 | use Symfony\Component\HttpFoundation\Response; 18 | 19 | /** 20 | * SecretDocumentHttpException 21 | * 22 | * @category Board 23 | * @package Xpressengine\Plugins\Board 24 | * @author XE Developers 25 | * @copyright 2019 Copyright XEHub Corp. 26 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 27 | * @link https://xpressengine.io 28 | */ 29 | class SecretDocumentHttpException extends HttpBoardException 30 | { 31 | protected $message = 'board::SecretStatePost'; 32 | protected $statusCode = Response::HTTP_FORBIDDEN; 33 | } 34 | -------------------------------------------------------------------------------- /src/GenericBoardSkin.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board; 15 | 16 | use Xpressengine\Skin\GenericSkin; 17 | 18 | /** 19 | * GenericBoardSkin 20 | * 21 | * @category Board 22 | * @package Xpressengine\Plugins\Board 23 | * @author XE Developers 24 | * @copyright 2019 Copyright XEHub Corp. 25 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 26 | * @link https://xpressengine.io 27 | */ 28 | class GenericBoardSkin extends GenericSkin 29 | { 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/HttpBoardException.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board; 15 | 16 | use Xpressengine\Support\Exceptions\HttpXpressengineException; 17 | 18 | /** 19 | * HttpBoardException 20 | * 21 | * @category Board 22 | * @package Xpressengine\Plugins\Board 23 | * @author XE Developers 24 | * @copyright 2019 Copyright XEHub Corp. 25 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 26 | * @link https://xpressengine.io 27 | */ 28 | class HttpBoardException extends HttpXpressengineException 29 | { 30 | protected $message = 'board::boardError'; 31 | } 32 | -------------------------------------------------------------------------------- /src/Models/BoardCategory.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Models; 15 | 16 | use Xpressengine\Database\Eloquent\DynamicModel; 17 | use Xpressengine\Category\Models\CategoryItem; 18 | 19 | /** 20 | * BoardCategory 21 | * 22 | * @property string target_id 23 | * @property int item_id 24 | * 25 | * @category Board 26 | * @package Xpressengine\Plugins\Board 27 | * @author XE Developers 28 | * @copyright 2019 Copyright XEHub Corp. 29 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 30 | * @link https://xpressengine.io 31 | */ 32 | class BoardCategory extends DynamicModel 33 | { 34 | protected $table = 'board_category'; 35 | 36 | public $timestamps = false; 37 | 38 | protected $primaryKey = 'target_id'; 39 | 40 | protected $fillable = ['target_id', 'item_id']; 41 | 42 | /** 43 | * The "type" of the primary key ID. 44 | * 45 | * @var string 46 | */ 47 | protected $keyType = 'string'; 48 | 49 | /** 50 | * get category item 51 | * 52 | * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 53 | */ 54 | public function categoryItem() 55 | { 56 | return $this->belongsTo(CategoryItem::class, 'item_id'); 57 | } 58 | 59 | /** 60 | * get category item word 61 | * 62 | * @return mixed 63 | */ 64 | public function getWord() 65 | { 66 | return $this->categoryItem->word; 67 | } 68 | 69 | /** 70 | * get array 71 | * 72 | * @return array 73 | */ 74 | public function toArray() 75 | { 76 | $this->categoryItem; 77 | $this->categoryItem->trans_word = xe_trans($this->categoryItem->word); 78 | $this->categoryItem->trans_description = xe_trans($this->categoryItem->description); 79 | 80 | return parent::toArray(); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/Models/BoardData.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Models; 15 | 16 | use Illuminate\Database\Query\JoinClause; 17 | use Xpressengine\Database\Eloquent\Builder; 18 | use Xpressengine\Database\Eloquent\DynamicModel; 19 | use Xpressengine\Http\Request; 20 | 21 | /** 22 | * BoardData 23 | * 24 | * @property string target_id 25 | * @property int allowComment 26 | * @property int useAlarm 27 | * @property int fileCount 28 | * 29 | * @category Board 30 | * @package Xpressengine\Plugins\Board 31 | * @author XE Team (developers) 32 | * @copyright 2019 Copyright XEHub Corp. 33 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 34 | * @link https://xpressengine.io 35 | */ 36 | class BoardData extends DynamicModel 37 | { 38 | protected $table = 'board_data'; 39 | 40 | public $timestamps = false; 41 | 42 | protected $primaryKey = 'target_id'; 43 | 44 | protected $fillable = ['allow_comment', 'use_alarm', 'file_count']; 45 | 46 | public $incrementing = false; 47 | 48 | protected $casts = [ 49 | 'allow_comment' => 'int', 50 | 'use_alarm' => 'int', 51 | 'file_count' => 'int', 52 | ]; 53 | 54 | /** 55 | * The "type" of the primary key ID. 56 | * 57 | * @var string 58 | */ 59 | protected $keyType = 'string'; 60 | 61 | /** 62 | * check alarm status 63 | * 64 | * @return bool 65 | */ 66 | public function isAlarm() 67 | { 68 | return $this->getAttribute('use_alarm') == 1; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/Models/BoardFavorite.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Models; 15 | 16 | use Illuminate\Database\Query\JoinClause; 17 | use Xpressengine\Database\Eloquent\Builder; 18 | use Xpressengine\Database\Eloquent\DynamicModel; 19 | use Xpressengine\Http\Request; 20 | 21 | /** 22 | * BoardData 23 | * 24 | * @property int favorite_id 25 | * @property string target_id 26 | * @property string user_id 27 | * 28 | * @category Board 29 | * @package Xpressengine\Plugins\Board 30 | * @author XE Team (developers) 31 | * @copyright 2019 Copyright XEHub Corp. 32 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 33 | * @link https://xpressengine.io 34 | */ 35 | class BoardFavorite extends DynamicModel 36 | { 37 | public $timestamps = false; 38 | 39 | protected $primaryKey = 'favorite_id'; 40 | 41 | protected $fillable = ['target_id', 'user_id']; 42 | } 43 | -------------------------------------------------------------------------------- /src/Models/BoardGalleryThumb.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board\Models; 15 | 16 | use Xpressengine\Database\Eloquent\DynamicModel; 17 | use Xpressengine\Media\Models\Image; 18 | use Xpressengine\Media\Models\Media; 19 | use Xpressengine\Plugins\Board\Components\Modules\BoardModule; 20 | 21 | /** 22 | * BoardGalleryThumb 23 | * 24 | * @category Board 25 | * @package Xpressengine\Plugins\Board 26 | * @author XE Developers 27 | * @copyright 2019 Copyright XEHub Corp. 28 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 29 | * @link https://xpressengine.io 30 | */ 31 | class BoardGalleryThumb extends DynamicModel 32 | { 33 | public $timestamps = false; 34 | 35 | public $incrementing = false; 36 | 37 | protected $primaryKey = 'target_id'; 38 | 39 | protected $fillable = [ 40 | 'target_id', 41 | 'board_thumbnail_file_id', 42 | 'board_thumbnail_external_path', 43 | 'board_thumbnail_path' 44 | ]; 45 | 46 | /** 47 | * The "type" of the primary key ID. 48 | * 49 | * @var string 50 | */ 51 | protected $keyType = 'string'; 52 | 53 | /** 54 | * thumbnail의 실제 url을 반환 55 | * 56 | * @param string $value board_thumbnail_path attribute 57 | * 58 | * @return string 59 | */ 60 | public function getBoardThumbnailPathAttribute($value) 61 | { 62 | $thumbnailImage = Image::find($this->board_thumbnail_file_id); 63 | if ($thumbnailImage == null) { 64 | return ''; 65 | } 66 | 67 | if ($value !== '') { 68 | $media = \XeMedia::getHandler(Media::TYPE_IMAGE)->getThumbnail( 69 | $thumbnailImage, 70 | BoardModule::THUMBNAIL_TYPE, 71 | 'L' 72 | ); 73 | 74 | $value = $media->url(); 75 | } 76 | 77 | return $value; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/RecycleBin.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright 2019 Copyright XEHub Corp. 11 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 12 | * @link https://xpressengine.io 13 | */ 14 | namespace Xpressengine\Plugins\Board; 15 | 16 | use Xpressengine\Trash\RecycleBinInterface; 17 | use Xpressengine\Plugins\Board\Models\Board; 18 | use Xpressengine\Plugins\Board\Components\Modules\BoardModule; 19 | 20 | /** 21 | * RecycleBin 22 | * 23 | * Core Trash 에서 처리될 휴지통 구현체 24 | * 25 | * @category Board 26 | * @package Xpressengine\Plugins\Board 27 | * @author XE Developers 28 | * @copyright 2019 Copyright XEHub Corp. 29 | * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL 30 | * @link https://xpressengine.io 31 | */ 32 | class RecycleBin implements RecycleBinInterface 33 | { 34 | 35 | /** 36 | * 휴지통 이름 반환 37 | * 38 | * @return string 39 | */ 40 | public static function name() 41 | { 42 | return 'board'; 43 | } 44 | 45 | /** 46 | * 휴지통 비우기 처리할 때 수행해야 할 코드 입력 47 | * TrashManager 에서 휴지통 비우기(clean()) 가 처리될 때 사용 48 | * 49 | * @return void 50 | */ 51 | public static function clean() 52 | { 53 | /** @var Handler $handler */ 54 | $handler = app('xe.board.handler'); 55 | /** @var ConfigHandler $configManager */ 56 | $configHandler = app('xe.board.config'); 57 | $boards = Board::where('status', 'trash')->where('type', BoardModule::getId())->get(); 58 | 59 | $configs = []; 60 | foreach ($boards as $board) { 61 | if (isset($configs[$board->instance_id]) === false) { 62 | $configs[$board->instance_id] = $configHandler->get($board->instance_id); 63 | } 64 | 65 | // 인스턴스 설정 정보를 찾을 수 없을 경우 삭제할 수 없는 문제 있음 66 | if (isset($configs[$board->instance_id]) === true) { 67 | $handler->remove($board, $configs[$board->instance_id]); 68 | } 69 | } 70 | } 71 | 72 | /** 73 | * 휴지통 패키지에서 각 휴지통의 상태를 알 수 있도록 정보를 반환 74 | * 휴지통에 얼마만큼의 정보가 있는지 알려주기 위한 인터페이스 75 | * 76 | * @return string 77 | */ 78 | public static function summary() 79 | { 80 | $count = Board::where('status', 'trash')->where('type', BoardModule::getId())->count(); 81 | 82 | // todo: translation 83 | return sprintf('휴지통에 %s건의 문서가 있습니다.', $count); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /webpack.config.babel.js: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import webpack from 'webpack' 3 | import CopyWebpackPlugin from 'copy-webpack-plugin' 4 | 5 | export default { 6 | entry: { 7 | 'assets/js/BoardTags': './assets/js/src/BoardTags.js', 8 | 'assets/js/board': './assets/js/src/board.js' 9 | }, 10 | output: { 11 | path: path.resolve(__dirname, './'), 12 | filename: '[name].js' 13 | }, 14 | plugins: [ 15 | new CopyWebpackPlugin([ 16 | { 17 | context: path.resolve(__dirname, 'assets/js/src'), 18 | from: '**/*', 19 | to: path.resolve(__dirname, 'assets/js'), 20 | ignore: [ 21 | '**/*.jsx', 22 | '**/*.vue', 23 | 'board.js' 24 | ] 25 | } 26 | ]) 27 | ], 28 | module: { 29 | loaders: [ 30 | { 31 | test: /(\.js)$/, 32 | loader: 'babel-loader', 33 | exclude: /node_modules/, 34 | query: { 35 | cacheDirectory: true 36 | } 37 | } 38 | ] 39 | }, 40 | resolve: { 41 | extensions: ['.js', '.jsx'], 42 | alias: { 43 | 'vue$': 'vue/dist/vue.esm.js' 44 | } 45 | }, 46 | externals: { 47 | window: 'window' 48 | } 49 | } 50 | --------------------------------------------------------------------------------