npm package: @newbiz/admin-components
Description: ## 설치 ``` npm install ```
Author: newbiz
Latest version: 0.1.23

# admin-components  

## 설치
```
npm install
```

## 컴포넌트 빌드
```
npm run build
```

## 예제 실행 (컴포넌트 직접 연결)
```
cd example
npm run serve
```

## 예제 실행 (빌드 나온거 연결)
```
cd example
npm run serve:test
```

## 배포
```
npm publish --access=public
```

## 플러그인 설정
```js
import Vue from 'vue'
import AdminComponents from '@newbiz/admin-components'
import '@newbiz/admin-components/dist/adminComponents.css'

Vue.use(AdminComponents)
```

## Global Component
element-ui component, checkbox-group, common-table, date-range-picker, editor,
image-uploader, input-digit, prev-next-picker, radio-group, result-tree

## Local Component
```js
import { AlertDialog, Breadcrumb } from '@newbiz/admin-components'
```


### AlertDialog Example
example/Popup.vue 파일 참고

props 정보는 아래 참고
```html
<alert-dialog v-bind="props"/>
```

props 정보
```js
props = {
    dialogAttr: { type: Object, default: () => ({ width: '30%', top: '10vh' }) }, // el-dialog attributes
    titleAttr: { type: Object, default: () => ({ title: null, titleClass: null }) },
    contentAttr: {
      type: Object,
      default: () => ({
        content: '',
        contentClass: null,
        data: null, // 동적으로 들어갈 component props
      }),
    },
    footerAttr: {
      type: Object,
      default: () => ({
        buttons: [
          {
            id: 'btn-ok',
            label: '확인',
            isPrimary: true,
            isCancel: false,
            btnClass: '',
            btnAttr: null, // el-button attributes
          },
        ],
        footerClass: null,
      }),
    },
    callback: { type: Function, default: () => {} },
}
```

* content 가 component 형식 
- beforeClose (selectedId, done) 구현
```js
function beforeClose (selectedId, done) {
    if (selectedId === 'btn-ok') {
        done('전달할 데이터')
    }
}
```


### Breadcrumb Example
```html
<breadcrumb :menuInfo="menuInfo"/>
```

props 정보
```js
props = {
    menuInfo: { type: Object, required: true },
}
```

데이터 구조
```js
menuInfo = { tree: {}, list: [] }
```


### CheckboxGroup Example
example/Forms.vue 파일 참고

sync 를 걸어주거나, v-on:update 로 직접 데이터 관리
```html
<checkbox-group :items="checkboxGroupItems" :selectedIds.sync="checkGroupsSelectedIds"/>
<checkbox-group :items="checkboxGroupItems" :selectedIds="checkGroupsSelectedIds" @update="onChangeCheckboxGroup"/>
```

props 정보
```js
props = {
    items: { type: Array, required: true },
    selectedIds: { type: Array, default: () => [] },
    labelAll: { type: String, default: '전체' },
}
```

데이터 구조
```js
checkboxGroupItems = [
    { id: 'HOTEL', label: '호텔' },
    { id: 'MOTEL', label: '모텔' },
]
function onChangeCheckboxGroup (selectedIds) {
    this.checkGroupsSelectedIds = selectedIds
}
```


### RadioGroup Example
example/Forms.vue 파일 참고

sync 를 걸어주거나, v-on:update 로 직접 데이터 관리
```html
<radio-group :items="radioGroupItems" :selectedId.sync="radioGroupSelectedId"/>
<radio-group :items="radioGroupItems" :selectedId="radioGroupSelectedId" @update="onChangeRadioGroup"/>
```

props 정보
```js
props = {
    items: { type: Array, required: true },
    selectedId: { type: [String, Number, Boolean] },
}
```

데이터 구조
```js
radioGroupItems = [
    { id: 'ALL', label: '전체' },
    { id: 'ENABLE', label: '이용가능' },
    { id: 'DISABLE', label: '이용불가' },
]
function onChangeRadioGroup (selectedId) {
    this.radioGroupSelectedId = selectedId
}
```


### InputDigit Example
example/Forms.vue 파일 참고

sync 를 걸어주거나, v-on:change 로 직접 데이터 관리
```html
<input-digit :value.sync="inputDigit"/>
<input-digit :value="inputDigit" @change="value => inputDigit = value"/>
```

props 정보
```js
props = {
    value: { type: String, default: '' },
    placeholder: { type: String, default: '' },
    disabled: { type: Boolean, default: false },
    step: { type: Number, default: 10 },
    isParsePercentage: { type: Boolean, default: false }, // 소수점 할푼리
    delimiter: { type: String, default: '' }, // 구분자
}
```


### PrevNextPicker Example
example/Forms.vue 파일 참고

v-on:change 로 직접 데이터 관리
```html
<prev-next-picker :value="currentYear" min="1900" max="3000" @change="(value, event) => currentYear = value">
```

props 정보
```js
props = {
    value: { type: [String, Number], default: 0 },
    min: { type: [String, Number], default: -Infinity },
    max: { type: [String, Number], default: Infinity },
    step: { type: [String, Number], default: 1 },
}
```


### DateRangePicker Example
example/Forms.vue 파일 참고

sync 를 걸어주거나, v-on:change 로 직접 데이터 관리
```html
<date-range-picker :dateRange.sync="dateRangeVal" :pickerAttr="{ type: 'datetimerange' }"/>
<date-range-picker :dateRange="dateRangeVal" :pickerAttr="{ type: 'daterange' }" @change="value => dateRangeVal = value"/>
```

props 정보
```js
props = {
    dateRange: { type: Array, default: () => [] },
    shortCutTypes: { type: Array, default: () => defaultShortCut }, // shortCut 설정 (미설정 시 전체 표현)
    pickerAttr: { type: Object, default: () => ({}) }, // el-date-picker attributes
}
```


### ImageUploader Example
example/Forms.vue 파일 참고

sync 를 사용
```html
<image-uploader :fileList.sync="uploadedFileList" :rawFileList.sync="uploadedFileListRaw"/>
```

props 정보
```js
props = {
    labelName: String, // vee-validate 전용
    fileList: { type: Array, required: true }, // sync
    rawFileList: { type: Array, default: () => [] },
    baseUrl: { type: String, default: '' }, // 서버 요청 주소
    headers: { type: Object, default: () => {} }, // 헤더 정보
    params: { type: Object, default: () => {} }, // 파라미터 정보
    listType: { type: String, default: 'text' },
    autoUpload: { type: Boolean, default: true }, // 이미지 width, height 필요할 경우 false
    disabled: { type: Boolean, default: false },
    limit: { type: Number, default: 1 }, // 파일 제한
    isShowHelpMsg: { type: Boolean, default: false }, // 도움말
}
```


### ResultTree Example
example/ResultTree.vue 파일 참고

```html
<result-tree :items="TREE_LIST">
    <template v-slot="{ node, data }">
        <radio-group/>
    </template>
</result-tree>
```

props 정보
```js
props = {
    items: { type: Array, default: () => [] },
    selectedItems: { type: Array, default: () => [] }, // 선택된 노드 ID (:selectedItems.sync)
    placeholder: { type: String, default: '검색 필터를 입력해주세요.' },
    propKeyId: { type: String, default: 'id' }, // id 대신 사용할 키명
    propKeyLabel: { type: String, default: 'label' }, // label 대신 사용할 키명
    propKeyParent: { type: String, default: 'parent' }, // children 대신 사용할 키명
    propKeyChildren: { type: String, default: 'children' }, // children 대신 사용할 키명
    isExpandAll: { type: Boolean, default: false }, // 전체 트리 확장 표시 여부
    isCheckable: { type: Boolean, default: false }, // 체크 가능 여부
}
```

데이터 구조
```js
data = [{
    id: 1,
    label: 'Level one 1',
    children: [{
        id: 4,
        label: 'Level two 1-1',
    }]
}, {
    id: 2,
    label: 'Level one 2',
    children: [{
        id: 5,
        label: 'Level two 2-1'
    }, {
        id: 6,
        label: 'Level two 2-2'
    }]
}, {
    id: 3,
    label: 'Level one 3',
    children: [{
        id: 7,
        label: 'Level two 3-1'
    }, {
        id: 8,
        label: 'Level two 3-2'
    }]
}]
```


### CommonTable Example
example/CommonTable.vue 파일 참고

```html
<common-table
    isShowPagination
    :totalCount="items.length"
    :rowCount="10"
    :selectedRowIndex.sync="selectedRowIndex"
    :items="items"
    :columns="columns"
    :tableAttr="{ highlightCurrentRow: true }"
    :tableEvent="{ 'selection-change': onChangeSelect, 'current-change': onSelectRow }"
    @pageChange="onChangePage"
    >
    <h2 slot="leftBox" class="subtitle">
      공통 테이블 목록 <span class="result-mes">총 <strong>{{ items.length }}</strong> 건</span>
    </h2>
    <span slot="rightBox">
      <el-button size="mini" @click="onClickExcelExportBtn">엑셀다운로드</el-button>
      <el-divider direction="vertical"/>
    </span>
    <template v-slot:manage>
      <span>
        <el-button size="mini" class="demi-mini">상세보기</el-button>
      </span>
    </template>
</common-table>
```

event 정보
```js
// pageChange - (nextPage) - 페이지 클릭 이벤트 핸들러
```

props 정보
```js
props = {
    isShowTop: { type: Boolean, default: true },
    isShowPageSize: { type: Boolean, default: true }, // 페이지 사이즈 컴포넌트 사용 여부
    isShowPagination: { type: Boolean, default: false }, // 페이지 출력할지 여부
    totalCount: { type: Number, default: 0 }, // 전체 데이터 갯수
    rowCount: { type: Number }, // 결과 표시 갯수 (10,30,60,90) (:rowCount.sync)
    selectedRowIndex: { type: Number, default: null }, // 선택된 테이블 row 표시 (:selectedRowIndex.sync)
    items: { type: Array, default: () => [] }, // 테이블 데이터
    tableAttr: { type: Object, default: () => ({}) }, // el-table attributes
    tableEvent: { type: Object, default: () => ({}) }, // el-table events
    /*
     * column: {
     *   el-table-column attributes
     *   childrenColumns: 있으면 그룹
     *   render(): 해당 칼럼 값을 커스텀하게 랜더링 (결과값만 랜더링하고 그 외에는 slot을 이용)
     * }
     */
    columns: { type: Array, required: true }, // 테이블 칼럼 정보
    help: { type: String, default: null }, // 테이블 하단 도움말 메시지
    invalid: { type: String, default: null }, // 테이블 하단 오류 메시지
}
```