,
diff --git a/src/pages/CreateProblem/detail/index.tsx b/src/pages/CreateProblem/detail/index.tsx
index a5fc70e..b6a4e0e 100644
--- a/src/pages/CreateProblem/detail/index.tsx
+++ b/src/pages/CreateProblem/detail/index.tsx
@@ -28,16 +28,16 @@ export default function CreateProblemDetail() {
state.isWaiting ||
state.option.input_type
) {
+ console.log('早期リターン - 条件に該当')
return // データがまだ取得されていない場合は何もしない
}
-
if (
state.createProblemDetail.is_multiple_choice !==
state.option.input_type
) {
+ console.log('出題形式が異なるため、処理をスキップ')
/* 保存されている出題形式と編集中の出題形式が一緒じゃない時option.content(模範解答)を削除 */
} else if (!state.option.input_type) {
- /* 出題形式が選択式の時option.contentとoption.option_nameの""を削除して文字型から配列に変更 */
Action.convertStringsToArray(dispatch, {
content: state.option.content,
option_name: state.option.option_name,
@@ -442,7 +442,20 @@ export default function CreateProblemDetail() {
)}
-
+
diff --git a/src/pages/CreateProblem/detail/reducer.ts b/src/pages/CreateProblem/detail/reducer.ts
index ee6c8fe..9b1849f 100644
--- a/src/pages/CreateProblem/detail/reducer.ts
+++ b/src/pages/CreateProblem/detail/reducer.ts
@@ -1,7 +1,6 @@
-import { OptionsVO } from '@/models/entity/Options'
-import { ProblemVO } from '@/models/entity/Problem'
-import { TagsVO } from '@/models/entity/Tags'
-import { stat } from 'fs'
+import { OptionsVO } from '@/models/entity/client/Options'
+import { ProblemVO } from '@/models/entity/client/Problem'
+import { TagsVO } from '@/models/entity/client/Tags'
export type ActionType =
//===============================================
@@ -30,6 +29,16 @@ export type ActionType =
type: 'FIND_CREATE_PROBLEM_DETAIL_FAILURE'
}
// ==============================================
+ | {
+ type: 'SAVE_CREATE_PROBLEM_DETAIL_REQUEST'
+ }
+ | {
+ type: 'SAVE_CREATE_PROBLEM_DETAIL_SUCCESS'
+ }
+ | {
+ type: 'SAVE_CREATE_PROBLEM_DETAIL_FAILURE'
+ }
+ // ==============================================
| {
type: 'CONVERT_STRINGS_TO_ARRAY'
payload: {
@@ -202,6 +211,22 @@ export function reducer(state: State, action: ActionType): State {
isWaiting: false,
}
// ==============================================
+ case 'SAVE_CREATE_PROBLEM_DETAIL_REQUEST':
+ return {
+ ...state,
+ isWaiting: true,
+ }
+ case 'SAVE_CREATE_PROBLEM_DETAIL_SUCCESS':
+ return {
+ ...state,
+ isWaiting: false,
+ }
+ case 'SAVE_CREATE_PROBLEM_DETAIL_FAILURE':
+ return {
+ ...state,
+ isWaiting: false,
+ }
+ // ==============================================
case 'CONVERT_STRINGS_TO_ARRAY':
return {
...state,
diff --git a/src/pages/CreateProblem/index.tsx b/src/pages/CreateProblem/index.tsx
index abbf444..3dded2d 100644
--- a/src/pages/CreateProblem/index.tsx
+++ b/src/pages/CreateProblem/index.tsx
@@ -2,7 +2,6 @@ import { useLocation, useNavigate, useSearchParams } from 'react-router-dom'
import styles from './style.module.css'
import { useEffect, useReducer } from 'react'
import { Button } from '@/stories/Button'
-import { useGenre } from '@/hooks/useGenre'
import { Action } from './action'
import { defaultState, reducer } from './reducer'
import { NumberUtils } from '@/utils/number_utils'
@@ -74,10 +73,12 @@ export default function CreateProblem() {
{state.tags.map((tag) =>
- tag.id === item.tags ? (
-
+ tag.id === item.fk_tags ? (
+
+
+
) : (
''
),
@@ -91,7 +92,7 @@ export default function CreateProblem() {
|
{state.status.map((sta) =>
- sta.id === item.status
+ sta.id === item.fk_status
? sta.status_name
: '',
)}
diff --git a/src/pages/CreateProblem/reducer.ts b/src/pages/CreateProblem/reducer.ts
index 87d0f05..49648fb 100644
--- a/src/pages/CreateProblem/reducer.ts
+++ b/src/pages/CreateProblem/reducer.ts
@@ -1,6 +1,6 @@
-import { CreateProblemFmt001VO } from '@/models/entity/fmt/CreateProblemFmt0001'
-import { StatusVO } from '@/models/entity/Status'
-import { TagsVO } from '@/models/entity/Tags'
+import { CreateProblemFmt001VO } from '@/models/entity/client/fmt/CreateProblemFmt0001'
+import { StatusVO } from '@/models/entity/client/Status'
+import { TagsVO } from '@/models/entity/client/Tags'
export type ActionType =
// ==============================================
diff --git a/src/pages/Login/page.tsx b/src/pages/Login/page.tsx
index e94eeb4..1cd0770 100644
--- a/src/pages/Login/page.tsx
+++ b/src/pages/Login/page.tsx
@@ -1,7 +1,42 @@
+import styles from './style.module.css'
+import logo from '../../assets/w2cLogo.svg'
+import { Button } from '@/stories/Button'
+
export default function Login() {
- return (
- <>
- Loginページ
- >
- )
+ return (
+ <>
+
+
+
+
+
+ 学校のメールアドレスを入力してください
+
+
+
+ >
+ )
}
diff --git a/src/pages/Login/style.module.css b/src/pages/Login/style.module.css
new file mode 100644
index 0000000..25888cf
--- /dev/null
+++ b/src/pages/Login/style.module.css
@@ -0,0 +1,73 @@
+.loginBg {
+ width: 100%;
+ height: 100vh;
+ background: linear-gradient( to top, #E3F9FB, #87DBF9);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+
+ .errorMes {
+ color: #D53B1C;
+ font-weight: bold;
+ margin-top: 16px;
+ }
+
+ .loginForm {
+ margin-top: 16px;
+ width: 50%;
+ height: 60%;
+ background-color: #86A0A6;
+ border-radius: 16px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+
+ form {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-around;
+ align-items: center;
+
+ .inputWrap {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ >p {
+ color: white;
+ font-size: 32px;
+ font-weight: bold;
+ }
+ .input {
+ width: 85%;
+ display: flex;
+ flex-direction: column;
+
+ label {
+ color: white;
+ margin: 4px 0;
+ }
+ input {
+ width: 100%;
+ height: 40px;
+ border-radius: 8px;
+ border: none;
+ padding-left: 1rem;
+ }
+ }
+ }
+ .BtnWrap {
+ p {
+ margin-top: 8px;
+ color: white;
+ text-decoration: underline;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/Problems/action.ts b/src/pages/Problems/action.ts
index e69de29..54eb7d6 100644
--- a/src/pages/Problems/action.ts
+++ b/src/pages/Problems/action.ts
@@ -0,0 +1,37 @@
+import { ActionType } from './reducer'
+
+export namespace Action {
+ export async function openForm(
+ dispatch: React.Dispatch,
+ tagName: string,
+ ) {
+ dispatch({
+ type: 'OPEN_FORM',
+ payload: {
+ tagName,
+ },
+ })
+ }
+
+ export async function findGenreProblem(
+ dispatch: React.Dispatch,
+ cond: {
+ offset: number
+ limit: number
+ },
+ ) {
+ dispatch({
+ type: 'FIND_GENRE_PROBLEM_REQUEST',
+ payload: {
+ offset: cond.offset,
+ limit: cond.limit,
+ },
+ })
+
+ try {
+ } catch (e) {
+ dispatch({ type: 'FIND_GENRE_PROBLEM_FAILURE' })
+ throw e
+ }
+ }
+}
diff --git a/src/pages/Problems/index.tsx b/src/pages/Problems/index.tsx
index d252977..d555750 100644
--- a/src/pages/Problems/index.tsx
+++ b/src/pages/Problems/index.tsx
@@ -2,19 +2,17 @@ import styles from './style.module.css'
import filterImg from '@/assets/filter.svg'
import sortImg from '@/assets/sort.svg'
import arrow from '@/assets/arrow.svg'
-import { useState } from 'react'
+import { useEffect, useReducer } from 'react'
+import { defaultState, reducer } from './reducer'
+import { useLocation } from 'react-router-dom'
+import { Action } from './action'
export default function Problems() {
- const [state, setState] = useState({
- front: false,
- HTML: false,
- CSS: false,
- JS: false,
- design: false,
- Figma: false,
- Illustrator: false,
- Photoshop: false,
- })
+ const [state, dispatch] = useReducer(reducer, undefined, defaultState)
+ const location = useLocation()
+
+ useEffect(() => {}, [location.search])
+
return (
<>
@@ -54,45 +52,42 @@ export default function Problems() {
- setState((prev) => ({
- ...prev,
- front: !prev.front,
- }))
+ Action.openForm(dispatch, 'genre.front')
}
>
フロントエンド
- {state.front && (
+ {state.genreFlag.front && (
- setState((prev) => ({
- ...prev,
- HTML: !prev.HTML,
- }))
+ Action.openForm(
+ dispatch,
+ 'genre.HTML',
+ )
}
>
HTML
- {state.HTML && (
+ {state.genreFlag.HTML && (
<>
>
)}
-
- 
+
+ Action.openForm(
+ dispatch,
+ 'genre.CSS',
+ )
+ }
+ >
+
CSS
-
- 
+ {state.genreFlag.CSS && (
+ <>
+
+ >
+ )}
+
+ Action.openForm(
+ dispatch,
+ 'genre.JS',
+ )
+ }
+ >
+
JavaScript
+ {state.genreFlag.JS && (
+ <>
+
+ >
+ )}
)}
@@ -153,37 +228,202 @@ export default function Problems() {
- setState((prev) => ({
- ...prev,
- design: !prev.design,
- }))
+ Action.openForm(dispatch, 'genre.design')
}
>
デザイン
- {state.design && (
+ {state.genreFlag.design && (
-
- 
+
+ Action.openForm(
+ dispatch,
+ 'genre.Figma',
+ )
+ }
+ >
+
Figma
-
- 
+ {state.genreFlag.Figma && (
+ <>
+
+ >
+ )}
+
+ Action.openForm(
+ dispatch,
+ 'genre.Illustrator',
+ )
+ }
+ >
+
Illustrator
-
- 
+ {state.genreFlag.Illustrator && (
+ <>
+
+ >
+ )}
+
+ Action.openForm(
+ dispatch,
+ 'genre.Photoshop',
+ )
+ }
+ >
+
Photoshop
+ {state.genreFlag.Photoshop && (
+ <>
+
+ >
+ )}
+
+ Action.openForm(
+ dispatch,
+ 'genre.ColorTheoryTest',
+ )
+ }
+ >
+ 
+ 色彩
+
+ {state.genreFlag.ColorTheoryTest && (
+ <>
+
+ >
+ )}
)}
diff --git a/src/pages/Problems/reducer.ts b/src/pages/Problems/reducer.ts
index e69de29..0e4a272 100644
--- a/src/pages/Problems/reducer.ts
+++ b/src/pages/Problems/reducer.ts
@@ -0,0 +1,180 @@
+import { ProblemFmt0001VO } from '@/models/entity/client/fmt/ProblemFmt0001VO'
+import { TagsVO } from '@/models/entity/client/Tags'
+
+export type ActionType =
+ //===============================================
+ | {
+ type: 'OPEN_FORM'
+ payload: {
+ tagName: string
+ }
+ }
+ //===============================================
+ | {
+ type: 'FIND_GENRE_PROBLEM_REQUEST'
+ payload: {
+ offset: number
+ limit: number
+ }
+ }
+ | {
+ type: 'FIND_GENRE_PROBLEM_SUCCESS'
+ payload: {
+ problemList: ProblemFmt0001VO.Type[]
+ tags: TagsVO.Type[]
+ }
+ }
+ | {
+ type: 'FIND_GENRE_PROBLEM_FAILURE'
+ }
+//===============================================
+
+export type State = {
+ isWaiting: boolean
+ offset: number
+ limit: number
+ problemList: ProblemFmt0001VO.Type[]
+ tags: TagsVO.Type[]
+ genreFlag: {
+ front: boolean
+ HTML: boolean
+ CSS: boolean
+ JS: boolean
+ design: boolean
+ Figma: boolean
+ Illustrator: boolean
+ Photoshop: boolean
+ ColorTheoryTest: boolean
+ }
+}
+
+export function defaultState(): State {
+ return {
+ isWaiting: false,
+ offset: 0,
+ limit: 10,
+ problemList: [],
+ tags: [],
+ genreFlag: {
+ front: false,
+ HTML: false,
+ CSS: false,
+ JS: false,
+ design: false,
+ Figma: false,
+ Illustrator: false,
+ Photoshop: false,
+ ColorTheoryTest: false,
+ },
+ }
+}
+
+export function reducer(state: State, action: ActionType): State {
+ switch (action.type) {
+ // ==============================================
+ case 'OPEN_FORM': {
+ switch (action.payload.tagName) {
+ case 'genre.front':
+ return {
+ ...state,
+ genreFlag: {
+ ...state.genreFlag,
+ front: state.genreFlag.front ? false : true,
+ },
+ }
+ case 'genre.HTML':
+ return {
+ ...state,
+ genreFlag: {
+ ...state.genreFlag,
+ HTML: state.genreFlag.HTML ? false : true,
+ },
+ }
+ case 'genre.CSS':
+ return {
+ ...state,
+ genreFlag: {
+ ...state.genreFlag,
+ CSS: state.genreFlag.CSS ? false : true,
+ },
+ }
+ case 'genre.JS':
+ return {
+ ...state,
+ genreFlag: {
+ ...state.genreFlag,
+ JS: state.genreFlag.JS ? false : true,
+ },
+ }
+ case 'genre.design':
+ return {
+ ...state,
+ genreFlag: {
+ ...state.genreFlag,
+ design: state.genreFlag.design ? false : true,
+ },
+ }
+ case 'genre.Figma':
+ return {
+ ...state,
+ genreFlag: {
+ ...state.genreFlag,
+ Figma: state.genreFlag.Figma ? false : true,
+ },
+ }
+ case 'genre.Illustrator':
+ return {
+ ...state,
+ genreFlag: {
+ ...state.genreFlag,
+ Illustrator: state.genreFlag.Illustrator
+ ? false
+ : true,
+ },
+ }
+ case 'genre.Photoshop':
+ return {
+ ...state,
+ genreFlag: {
+ ...state.genreFlag,
+ Photoshop: state.genreFlag.Photoshop ? false : true,
+ },
+ }
+ case 'genre.ColorTheoryTest':
+ return {
+ ...state,
+ genreFlag: {
+ ...state.genreFlag,
+ ColorTheoryTest: state.genreFlag.ColorTheoryTest
+ ? false
+ : true,
+ },
+ }
+ }
+ throw new (class SystemException {})()
+ }
+ // ==============================================
+ case 'FIND_GENRE_PROBLEM_REQUEST':
+ return {
+ ...state,
+ isWaiting: true,
+ offset: action.payload.offset,
+ limit: action.payload.limit,
+ }
+ case 'FIND_GENRE_PROBLEM_SUCCESS':
+ return {
+ ...state,
+ isWaiting: false,
+ problemList: action.payload.problemList,
+ tags: action.payload.tags,
+ }
+ case 'FIND_GENRE_PROBLEM_FAILURE':
+ return {
+ ...state,
+ isWaiting: false,
+ }
+ // ==============================================
+ }
+
+ return state
+}
diff --git a/src/pages/Problems/style.module.css b/src/pages/Problems/style.module.css
index f57c594..6581e58 100644
--- a/src/pages/Problems/style.module.css
+++ b/src/pages/Problems/style.module.css
@@ -19,6 +19,8 @@
}
}
.problemsTableWrap {
+ margin-bottom: 32px;
+
.problemHeader {
width: 90%;
margin: 0 auto;
diff --git a/src/utils/baseURL.ts b/src/utils/baseURL.ts
new file mode 100644
index 0000000..0a5efa7
--- /dev/null
+++ b/src/utils/baseURL.ts
@@ -0,0 +1 @@
+export const baseURL = 'http://localhost:8787'
diff --git a/src/utils/boolean_utils.ts b/src/utils/boolean_utils.ts
new file mode 100644
index 0000000..413ee14
--- /dev/null
+++ b/src/utils/boolean_utils.ts
@@ -0,0 +1,14 @@
+export namespace BooleanUtils {
+ export function ensureBool(
+ src: boolean | null,
+ other: boolean = true,
+ ): boolean {
+ // srcがbooleanの場合はそのまま返す(true/falseをそのまま保持)
+ if (typeof src === 'boolean') {
+ return src
+ }
+
+ // srcがnullまたはundefinedの場合はデフォルト値(other)を返す
+ return other
+ }
+}
diff --git a/src/utils/core_utils.ts b/src/utils/core_utils.ts
index 98e19d1..ec98195 100644
--- a/src/utils/core_utils.ts
+++ b/src/utils/core_utils.ts
@@ -1,71 +1,11 @@
-import { v4 as uuidv4 } from 'uuid'
-
export namespace CoreUtils {
- /**
- * あなたIE?
- * @returns
- */
- export const isIE = () => {
- const ua = window.navigator.userAgent.toLowerCase()
- return ua.match(/(msie|trident)/) ? true : false
- }
-
- /**
- * クライアントのオリジンを取得
- * 当然サーバーサイドでは動作しません。
- * @returns
- */
- export const getHost = () => {
- if (location !== undefined) {
- return location.protocol + '//' + location.host
+ export const isEmpty = (src: T | undefined): src is undefined => {
+ return (
+ src === undefined ||
+ src === null ||
+ (typeof src === 'number' && isNaN(src)) ||
+ (typeof src === 'string' && src.trim().length === 0) ||
+ (typeof src === 'boolean' && true)
+ )
}
-
- return undefined
- }
-
- /**
- * UUID生成
- * uuidを直接生成させずにラッパーを提供するのは、途中で実装を変更する可能性があるため。
- * (例:uuidv4?uuidv5?何桁?)
- * @returns
- */
- export function genUUID(): string {
- return uuidv4()
- }
-
- /**
- * オブジェクトからnullまたはundefinedの項目を除去
- * @param obj
- * @returns
- */
- export function filterNulls(obj: T): T | undefined {
- if (obj === undefined || obj === null) {
- return undefined
- }
-
- const keyList = Object.keys(obj)
- for (const key of keyList) {
- /* eslint-disable */
- if ((obj as any)[key] === null || (obj as any)[key] === undefined) {
- delete (obj as any)[key]
- }
- /* eslint-enable */
- }
-
- return obj
- }
-
- /**
- * undefined/null/NaN/空文字(trim後)か否か判定する
- * @param src
- * @returns
- */
- export const isEmpty = (src: T | undefined): src is undefined => {
- return (
- src === undefined ||
- src === null ||
- (typeof src === 'number' && isNaN(src)) ||
- (typeof src === 'string' && src.trim().length === 0)
- )
- }
}
diff --git a/src/utils/number_utils.ts b/src/utils/number_utils.ts
index 74bd6e7..8db8a79 100644
--- a/src/utils/number_utils.ts
+++ b/src/utils/number_utils.ts
@@ -2,178 +2,198 @@ import Big from 'big.js'
import { CoreUtils } from './core_utils'
export namespace NumberUtils {
- export function formatNumber(
- src: number | undefined,
- maxFractionDigits: number = 0,
- ): string {
- if (src === undefined || src === null || isNaN(src)) {
- return ''
- }
+ export function ensureNumber(
+ src: number | null,
+ maxFractionDigits: number = 0,
+ ): number {
+ if (src === undefined || src === null || isNaN(src)) {
+ return maxFractionDigits
+ }
- try {
- return formatBig(Big(src), maxFractionDigits)
- } catch (e) {
- return ''
- }
- }
-
- export function formatBig(
- src: Big | undefined,
- maxFractionDigits: number = 0,
- ): string {
- if (!src) {
- return ''
+ return !CoreUtils.isEmpty(src) ? src : maxFractionDigits
}
- const strNum = src.toString()
-
- // 小数点はあるか
- const fractionDigitsSeparatorIdx = strNum.lastIndexOf('.')
- let strIntDigits = ''
- let strFractionDigits = ''
- if (fractionDigitsSeparatorIdx !== -1) {
- // 小数点あり
- // 整数部と小数部に分割
- strIntDigits = strNum.substring(0, fractionDigitsSeparatorIdx)
- strFractionDigits = strNum.substring(
- fractionDigitsSeparatorIdx + 1,
- strNum.length,
- )
- } else {
- // 整数のみ
- strIntDigits = strNum
- strFractionDigits = ''
+ export function formatNumber(
+ src: number | undefined,
+ maxFractionDigits: number = 0,
+ ): string {
+ if (src === undefined || src === null || isNaN(src)) {
+ return ''
+ }
+
+ try {
+ return formatBig(Big(src), maxFractionDigits)
+ } catch (e) {
+ return ''
+ }
}
- let result = ''
+ export function formatBig(
+ src: Big | undefined,
+ maxFractionDigits: number = 0,
+ ): string {
+ if (!src) {
+ return ''
+ }
- // 整数部を3桁毎にカンマで区切る
- let cnt = 0
- for (let i = strIntDigits.length - 1; i >= 0; i--) {
- result = strIntDigits.charAt(i) + result
+ const strNum = src.toString()
+
+ // 小数点はあるか
+ const fractionDigitsSeparatorIdx = strNum.lastIndexOf('.')
+ let strIntDigits = ''
+ let strFractionDigits = ''
+ if (fractionDigitsSeparatorIdx !== -1) {
+ // 小数点あり
+ // 整数部と小数部に分割
+ strIntDigits = strNum.substring(0, fractionDigitsSeparatorIdx)
+ strFractionDigits = strNum.substring(
+ fractionDigitsSeparatorIdx + 1,
+ strNum.length,
+ )
+ } else {
+ // 整数のみ
+ strIntDigits = strNum
+ strFractionDigits = ''
+ }
- cnt++
- if (cnt === 3 && i !== 0 && i > 0 && strIntDigits.charAt(i - 1) !== '-') {
- // 3桁目に到達かつ、文字の先端ではないかつ、左はマイナスではない
- // カンマ追加、カウンタリセット
- result = ',' + result
- cnt = 0
- }
- }
+ let result = ''
+
+ // 整数部を3桁毎にカンマで区切る
+ let cnt = 0
+ for (let i = strIntDigits.length - 1; i >= 0; i--) {
+ result = strIntDigits.charAt(i) + result
+
+ cnt++
+ if (
+ cnt === 3 &&
+ i !== 0 &&
+ i > 0 &&
+ strIntDigits.charAt(i - 1) !== '-'
+ ) {
+ // 3桁目に到達かつ、文字の先端ではないかつ、左はマイナスではない
+ // カンマ追加、カウンタリセット
+ result = ',' + result
+ cnt = 0
+ }
+ }
- // 小数部を指定桁まで追記
- if (strFractionDigits !== '' && maxFractionDigits > 0) {
- result += '.'
+ // 小数部を指定桁まで追記
+ if (strFractionDigits !== '' && maxFractionDigits > 0) {
+ result += '.'
- cnt = 0
- for (let i = 0; i < strFractionDigits.length; i++) {
- result += strFractionDigits[i]
+ cnt = 0
+ for (let i = 0; i < strFractionDigits.length; i++) {
+ result += strFractionDigits[i]
- cnt++
- if (cnt >= maxFractionDigits) {
- break
+ cnt++
+ if (cnt >= maxFractionDigits) {
+ break
+ }
+ }
}
- }
+
+ return result
}
- return result
- }
-
- const FILESIZE_DEFINES = [
- { unit: 'YB', length: Big('1208925819614629174706176') },
- { unit: 'ZB', length: Big('1180591620717411303424') },
- { unit: 'EB', length: Big('1152921504606846976') },
- { unit: 'PB', length: Big('1125899906842624') },
- { unit: 'TB', length: Big('1099511627776') },
- { unit: 'GB', length: Big('1073741824') },
- { unit: 'MB', length: Big('1048576') },
- { unit: 'KB', length: Big('1024') },
- ]
-
- export function formatFileLength(byteLength: number): string {
- if (byteLength === undefined || byteLength === null || isNaN(byteLength)) {
- return ''
+ const FILESIZE_DEFINES = [
+ { unit: 'YB', length: Big('1208925819614629174706176') },
+ { unit: 'ZB', length: Big('1180591620717411303424') },
+ { unit: 'EB', length: Big('1152921504606846976') },
+ { unit: 'PB', length: Big('1125899906842624') },
+ { unit: 'TB', length: Big('1099511627776') },
+ { unit: 'GB', length: Big('1073741824') },
+ { unit: 'MB', length: Big('1048576') },
+ { unit: 'KB', length: Big('1024') },
+ ]
+
+ export function formatFileLength(byteLength: number): string {
+ if (
+ byteLength === undefined ||
+ byteLength === null ||
+ isNaN(byteLength)
+ ) {
+ return ''
+ }
+
+ const wkByteLen = Big(byteLength)
+ for (const def of FILESIZE_DEFINES) {
+ if (def.length.lte(wkByteLen)) {
+ return (
+ formatBig(wkByteLen.div(def.length).round(0, Big.roundUp)) +
+ ' ' +
+ def.unit
+ )
+ }
+ }
+
+ return formatBig(wkByteLen) + ' B'
}
- const wkByteLen = Big(byteLength)
- for (const def of FILESIZE_DEFINES) {
- if (def.length.lte(wkByteLen)) {
- return (
- formatBig(wkByteLen.div(def.length).round(0, Big.roundUp)) +
- ' ' +
- def.unit
- )
- }
+ export function toString(src: Big): string {
+ return src ? src.toString() : ''
}
- return formatBig(wkByteLen) + ' B'
- }
-
- export function toString(src: Big): string {
- return src ? src.toString() : ''
- }
-
- export function parseBig(src: string): Big | undefined
- export function parseBig(src: string | undefined | null): Big | undefined
- export function parseBig(
- src: string | undefined | null,
- defaultValue: Big,
- ): Big
- export function parseBig(
- src: string | undefined | null,
- defaultValue: Big | undefined = undefined,
- ): Big | undefined {
- try {
- if (src === undefined || src === null) {
- return defaultValue
- }
-
- // カンマを除去
- return Big(src.trim().replaceAll(',', ''))
- /* eslint-disable */
- } catch (e) {
- /* eslint-enable */
- // 数値として解釈出来なかった...
- return defaultValue
+ export function parseBig(src: string): Big | undefined
+ export function parseBig(src: string | undefined | null): Big | undefined
+ export function parseBig(
+ src: string | undefined | null,
+ defaultValue: Big,
+ ): Big
+ export function parseBig(
+ src: string | undefined | null,
+ defaultValue: Big | undefined = undefined,
+ ): Big | undefined {
+ try {
+ if (src === undefined || src === null) {
+ return defaultValue
+ }
+
+ // カンマを除去
+ return Big(src.trim().replaceAll(',', ''))
+ /* eslint-disable */
+ } catch (e) {
+ /* eslint-enable */
+ // 数値として解釈出来なかった...
+ return defaultValue
+ }
}
- }
-
- export function parseNumber(src: string): number | undefined
- export function parseNumber(
- src: string | undefined | null,
- ): number | undefined
- export function parseNumber(
- src: string | undefined | null,
- defaultValue: number,
- ): number
- export function parseNumber(
- src: string | undefined | null,
- defaultValue: number | undefined = undefined,
- ): number | undefined {
- try {
- if (src === undefined || src === null) {
- return defaultValue
- }
-
- // カンマを除去
- const ret = parseInt(src.trim().replaceAll(',', ''))
- if (isNaN(ret)) {
- return defaultValue
- }
-
- return ret
- /* eslint-disable */
- } catch (e) {
- /* eslint-enable */
- // 数値として解釈出来なかった...
- return defaultValue
+
+ export function parseNumber(src: string): number | undefined
+ export function parseNumber(
+ src: string | undefined | null,
+ ): number | undefined
+ export function parseNumber(
+ src: string | undefined | null,
+ defaultValue: number,
+ ): number
+ export function parseNumber(
+ src: string | undefined | null,
+ defaultValue: number | undefined = undefined,
+ ): number | undefined {
+ try {
+ if (src === undefined || src === null) {
+ return defaultValue
+ }
+
+ // カンマを除去
+ const ret = parseInt(src.trim().replaceAll(',', ''))
+ if (isNaN(ret)) {
+ return defaultValue
+ }
+
+ return ret
+ /* eslint-disable */
+ } catch (e) {
+ /* eslint-enable */
+ // 数値として解釈出来なかった...
+ return defaultValue
+ }
}
- }
- export function nvl(src?: number, defaultValue: number = 0): number {
- if (CoreUtils.isEmpty(src)) {
- return defaultValue
+ export function nvl(src?: number, defaultValue: number = 0): number {
+ if (CoreUtils.isEmpty(src)) {
+ return defaultValue
+ }
+ return src
}
- return src
- }
}
diff --git a/src/utils/string_utils.ts b/src/utils/string_utils.ts
new file mode 100644
index 0000000..d4e14b1
--- /dev/null
+++ b/src/utils/string_utils.ts
@@ -0,0 +1,11 @@
+import { CoreUtils } from './core_utils'
+
+export namespace StringUtils {
+ export function nvl(src: string | undefined | null, other: string = '') {
+ if (typeof src !== 'string') {
+ return !(src === undefined || src === null) ? String(src) : other
+ }
+
+ return !CoreUtils.isEmpty(src) ? src : other
+ }
+}
|